以另一個使用者身分在 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 ..."'-- 請注意額外的引號。

相關內容