私は開発中の小さなソフトウェアをインストールするためのbashスクリプトを書いています。スクリプトはrootとして実行されますが、sudo
スクリプトによって実行されるいくつかのコマンドは、私が変数に名前を保持する通常のユーザーとして実行する必要があります(または実行する必要があります)$userName
。ほとんどのコマンドは1行のコマンドであり、su -c "/what/ever/command" $userName
十分に機能します。
しかし、実行したくないコマンドの1つがroot
私に何かを尋ねます(実際には1つだけですが、複数回:既存のファイルを上書きする必要があるかどうか)。 " "と呼ぶことができるコマンドには、基本的なbaaad_command
回答を提供するオプションはありません(" --assume-no
"またはそれに似ていません)。
唯一実行可能なオプションは、以下を使用することです。予想されるコマンドが出力され、文字列が""で始まるたびに""をコマンドして応答します。スクリプトでbaaad_commandで要求されるだけに「no」(「」を意味)で応答するようn\r
にしたいと思います。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 ..."'
。追加の引用符を参照してください。