expect
スクリプトに記載されている資格情報を使用してサーバーのリストにSSHを実行するスクリプトがあります。 SSHを介して特定のサーバーに接続できない場合、エラーは発生せずにリスト内の次のサーバーに接続し続けます。指定されたパスワードでSSHを実行できない場合は、スクリプトから通知したいと思います。これを行うには、スクリプトをどのように変更する必要がありますか?
最初のスクリプトは Expect スクリプトを呼び出すシェルスクリプトです。
#!/usr/bin/ksh
for host_name in `cat list`
do
/home/user1/ssh_script $host_name
done
#!/usr/local/bin/expect -f
set timeout 1
set host_name [lindex $argv 0]
spawn ssh -q -o StrictHostKeyChecking=no "user1\@$host_name"
expect "*assword:"
send "abcd@123\r";
expect "$\r"
puts "user1 loggedin successfully"
exit
interact
答え1
ラインのタイムアウト「パターン」を一致させることができますexpect
。例えば、
#!/usr/bin/expect -f
proc abort { } { send_user "Timeout!" ; exit 2 }
set timeout 1
set host_name [lindex $argv 0]
spawn ssh -q -o StrictHostKeyChecking=no "user1\@$host_name"
expect timeout abort "assword:"
send "abcd@123\r"
expect timeout abort "assword: " { send_user "bad password\n"; exit 3 } "$\r"
puts "user1 loggedin successfully"
これにより、先頭に一連のプロシージャが追加され、各項目にabort
パターン+タスクシーケンスが追加されます。これにより、タイムアウトが予想される場合にプロシージャが呼び出されます。プロシージャはstdoutに文字列を書き込み、デフォルト値0ではなく戻りコード2で終了します。必要に応じて、kshスクリプトでこの終了コードをテストできます。timeout abort
expect
"$"
間違ったログインパスワードを検出するには、正常にログインしたというメッセージと同時に2番目のパスワードプロンプトを見つけます。