我正在编写一个 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 ..."'
-- 请注意额外的引号。