Expectを使用して別のユーザーにsuし、そのユーザーとしてグラフィカルプログラムを実行します。私はkcalcを使用してテストしています:
#!/usr/bin/expect
set timeout 20
spawn su dummy
expect "Password:"
send "PASS\r";
send "kcalc\r"
また、最後の行を削除して、suを「sudummy -c kcalc」に変更しようとしましたが、それも機能しませんでした。どんな助けにも感謝します。
アカウントのパスワードをファイルシステムの周りに置いたままにする代わりに、具体的にこれを行うためのSudoコマンドを作成して、NOPASSWDオプションを付与してみませんか?
私は今日、スポーン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
ここにはいくつかのオプションがあります。
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 }
}