別のユーザーとしてbashスクリプト内でexpectを実行する

別のユーザーとしてbashスクリプト内でexpectを実行する

開発中の小さなソフトウェアをインストールするための bash スクリプトを作成しています。そのスクリプトはsudo(root として) 実行されますが、スクリプトによって実行されるコマンドの一部は、変数に名前を保存している通常のユーザーで実行する必要があります (または実行する必要があります) $userName。ほとんどのコマンドは 1 行で、su -c "/what/ever/command" $userName十分に機能します。

しかし、実行したくないコマンドの 1 つは、root私に質問します (実際には、既存のファイルを上書きするかどうかという質問が 1 つだけですが、何度も尋ねられます)。私が「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 ..."'-- を使用する必要があります。追加の引用符に注意してください。

関連情報