我正在編寫一個 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 ..."'
-- 請注意額外的引號。