開発中の小さなソフトウェアをインストールするための 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 ..."'
-- を使用する必要があります。追加の引用符に注意してください。