別の質問で、expect ステートメントと if/else ステートメントで抱えていたジレンマの解決策を親切に提供してくれました (基本的に、それらがどのように記述されているかについての知識が不足しています)。与えられたスクリプトは、1 つの例外を除いて機能します。リモート ホストに正常に接続すると、exit
その接続を閉じてリスト内の次のホストに移動するコマンドは送信されません。
これは、スクリプトの機能部分です。
while {[gets $file1 host] != -1} {
puts $host
spawn -noecho ssh $host
expect {
"continue connecting" {
send "yes\r"
expect {
"current" {
send -- $pw2\r
exp_continue
}
"New password" {
send -- $pw1\r
exp_continue
}
"Retype new password" {
send -- $pw1\r
exp_continue
}
msnyder
}
send "exit\r"
}
}
interact
}
ホストに接続すると、標準の Linux プロンプト [username@host ~]$ が表示されるはずです。少なくとも、それが私たちの標準的なプロンプトです。プロンプトの前にバナーが表示されます。それはこれにねじれを投げかけているのでしょうか?RSA指紋プロンプトから「接続を継続する」ことだけを探しており、それは複数行にまたがるテキスト内にあるため、そうは思いません。スクロールするテキストを無視し、入力を探しているプロンプト内のテキストのみを見るのに十分なほどインテリジェントであると思います。
exit
コマンドの引数としてコマンドを渡すことを検討しましssh $host
たが、期待していないようです。
exit
コマンドが適切に送信されるように、誰かが私を助けることができますか?
更新:exp_internal 1
スクリプトにオプションを追加して、スクリプトが何をしているかを確認しました.SSH接続が確立されると、ユーザープロンプトでも「接続を継続する」にのみ一致するようです. 「msnyder」の次の比較を実行していないようです。http://pastebin.com/kEGH3yUY
UPDATE2: 私は進歩しています。以下のGlenn Jackmanのスクリプトに基づいて、パスワードプロンプトが表示されるまでこれを機能させることができました。
set prompt {\$ $}
set file1 [open [lindex $argv 0] r]
set pw1 [exec cat /home/msnyder/bin/.pw1.txt]
set pw2 [exec cat /home/msnyder/bin/.pw2.txt]
while {[gets $file1 host] != -1} {
puts $host
spawn -noecho ssh -q $host
expect {
"continue connecting" {
send "yes\r"
expect {
"current" {
send -- $pw2\r
exp_continue
}
"New password" {
send -- $pw1\r
exp_continue
}
"Retype new password" {
send -- $pw1\r
exp_continue
}
-re $prompt {
send -- exit\r
expect eof
}
}
} -re $prompt {
send -- exit\r
expect eof
}
}
}
グレンが使用した短絡方式を試すのではなく、終了コマンドを2回送信するように明示的に指示しました(彼の回答の下での私のコメントによると、うまくいかなかったようです)。
現在起こっていることは、ホストのリストをループし、RSA 指紋プロンプトに「はい」を送信してから、コマンド プロンプトに「終了」を送信することです。ただし、パスワードを設定する必要があるサーバーにヒットすると、停止します。最終的にタイムアウトになり、次のホストで再起動するようです。現在のパスワードは送信されていません。