予想されるスクリプトを変更する必要があります。

予想されるスクリプトを変更する必要があります。

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 abortexpect


"$"間違ったログインパスワードを検出するには、正常にログインしたというメッセージと同時に2番目のパスワードプロンプトを見つけます。

関連情報