作为另一个用户在 bash 脚本中运行 expect

Bor*_*jaX 1 scripting bash su expect

我正在编写一个 bash 脚本来安装我正在开发的一些小软件。该脚本以sudo(以 root 身份)运行,但脚本执行的某些命令需要(或应该)由我将其名称保留在$userName变量中的普通用户运行。大多数命令都是单行的,而且su -c "/what/ever/command" $userName效果很好。

但是,我不想运行的其中一个命令root会问我一些事情(实际上,只有一件事,但很多次:是否应该覆盖现有文件)。我可能称之为“ baaad_command”的那个命令没有提供默认答案的任何选项(没有“ --assume-no”或类似的东西)。

我看是可行的唯一选择是使用预期的命令,并回复“ n\r”命令输出和串巫婆开始与每一次“ Overwrite”,我想我的脚本没有答复(意为“ n\r“)多次baaad_command问"Overwrite... ? [y/n]"

我尝试了许多不同的 su、spawn、expect 组合……但没有任何运气。

这是我迄今为止的最后一次尝试:

#!/bin/bash
if [[ -d "$destinationFolder" ]] ; then
    if [[ -n "$userName" ]] ; then
        spawned=$(su -c expect -c "
            spawn baaad_command --user \"foo\" --passwd \"bar\" \"$destinationFolder\"
             expect {
                 Overwrite: { send \"n\r\"; exp_continue }
                 eof { exit }
             }
        " )
    else
        echo "Don't have a non-root username to install baaad_command with. Skipping"
        exit 3
    fi
else
        echo "$destinationFolder directory not found in $(pwd). Can't continue"
        exit 2
fi
Run Code Online (Sandbox Code Playgroud)

与其他 200 次尝试相比,它没有任何显着的东西……只是碰巧是最后一次。

任何提示将不胜感激。先感谢您。

Jon*_*len 7

您可能需要使用su -c 'expect -c "spawn ..."'-- 注意额外的引号。