以另一个用户身份在 bash 脚本中运行 Expect

以另一个用户身份在 bash 脚本中运行 Expect

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

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

我认为唯一可行的选择是使用预计命令,并n\r在每次命令输出且字符串以“”开头时回复“”,我希望我的脚本按照 baaad_command 的要求多次Overwrite回复“否”(意思是“ ”)n\r"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

与其他 200 次尝试相比,它没有什么值得注意的地方……只是碰巧是最后一次。

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

答案1

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

相关内容