web-dev-qa-db-ja.com

SUおよびExpectを使用したコマンドの実行

Expectを使用して別のユーザーにsuし、そのユーザーとしてグラフィカルプログラムを実行します。私はkcalcを使用してテストしています:

#!/usr/bin/expect
set timeout 20
spawn su dummy
expect "Password:"
send "PASS\r";
send "kcalc\r"

また、最後の行を削除して、suを「sudummy -c kcalc」に変更しようとしましたが、それも機能しませんでした。どんな助けにも感謝します。

6
Sarah Cain

アカウントのパスワードをファイルシステムの周りに置いたままにする代わりに、具体的にこれを行うためのSudoコマンドを作成して、NOPASSWDオプションを付与してみませんか?

3
MrTuttle

私は今日、スポーンSSHセッションを使用してこれを行っていました。これは、私が書いたコードの一部であり、それが役立つかどうかはわかりません。

echo "Type the account you wish to use to issue the command, followed by [ENTER]: "
read account
read -s -p "Password: " password
echo "Type the command you wish to execute, followed by [ENTER]: "
read command
echo "Type the hostname you want to connect to, followed by [ENTER]: "
read hostname
switchToSudo="Sudo su"
shortenedHost=`echo $hostname|cut -d. -f 1`
accountSwitched="root@$shortenedHost:/home/$account#"


 VAR=$(expect -c "
        expect \"*~$\"
        send \"$switchToSudo\r\"
        expect \"*?assword*\"
        send \"$password\r\"
        spawn ssh $account@$hostname
        expect "*?assword:*"
        send \"$password\r\"
        expect \"*~$\"
        send \"$switchToSudo\r\"
        expect ""
        send \"$command\r\n\"
        send "logoff"
        ")
echo "=============="
echo "$VAR"
exit
2
Nolan

ここにはいくつかのオプションがあります。

1)MrTuttleが述べたように、NOPASSWDを使用してユーザーをsudoersに追加することをお勧めします。これにより、クリアテキストのルートパスワード/ etc/sudoersを保存する必要がなくなります。

yourUser ALL=(OtherUser) NOPASSWD:/path/to/kcalc 

あなたがすることができます

$ Sudo -u OtherUser kcalc

パスワードの入力を求められることなく。

2)現在のスクリプト。

現在のスクリプトは機能するはずですが、すべてのシステムとプロンプトが「パスワード:」を大文字にするわけではなく、最後にスペースを残すことに注意してください。 「assword」はテストに適した文字列であることがわかりました。もう1つ注意すべき点は、suがユーザーダミーではなくROOTパスワードを要求していることです。ルートパスワードをお持ちでない場合は、代わりにダミーとしてログインする必要があります(通常はssh -lダミーローカルホスト)

一部のデバッグ手順では、予想のパスワードフェーズ中に複数のステートメントを試すことができます。スクリプトの開発中に、タイムアウトとeofをテストしてレポートすることが役立つと思います。

これを試して、スクリプトがどこで終了するかを確認することができます

expect {
  -re "(.*)assword:"  { sleep 1; send -- "password\r" }
  timeout     { puts "un-able to login: timeout\n"; return }
  eof         { puts "Closed\n" ; return }
}    
1
Xarses