他のユーザーとしてbashスクリプトでExpectを実行する

他のユーザーとしてbashスクリプトでExpectを実行する

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

しかし、実行したくないコマンドの1つがroot私に何かを尋ねます(実際には1つだけですが、複数回:既存のファイルを上書きする必要があるかどうか)。 " "と呼ぶことができるコマンドには、基本的なbaaad_command回答を提供するオプションはありません(" --assume-no"またはそれに似ていません)。

唯一実行可能なオプションは、以下を使用することです。予想されるコマンドが出力され、文字列が""で始まるたびに""をコマンドして応答します。スクリプトでbaaad_commandで要求されるだけに「no」(「」を意味)で応答するようn\rにしたいと思います。Overwriten\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 ..."'。追加の引用符を参照してください。

おすすめ記事