
現在の作業は、複数のルーターのパスワードを確認し、パスワードがまだデフォルトに設定されている場合はそれを変更することです(例:ログイン:ABC、パスワード:ABC)。
このためのスクリプトを書いていますが、いくつかの問題があります。
コードは次のとおりです。
#!/usr/bin/expect -f
spawn telnet 10.15.160.69 #using a test IP, later it will read IP's from a list.
expect {
"Login: " {
send "ABC\r"
exp_continue
}
"Password: " {
send "ABC\r"
exp_continue
}
"> " {
send "passwd\r"
expect "Username: "
send "ABC\r"
expect "Password: "
send "ABC\r"
expect "New Password: "
send "n3wp@ss\r"
expect "Confirm New Password: "
send "n3wp@ss\r"
expect "> "
send "save\r"
}
}
ルータには、3回のパスワード試行後もログアウトしない特別な動作がありますが、代わりに正しい資格情報が提供されるかCtrl+D
(EOF)を押すまで、ログインとパスワードの入力を求められます。
以下をご覧ください:
Trying 10.15.160.69...
Connected to 10.15.160.69.
Escape character is '^]'.
BCM96816 Broadband Router
Login:
Password:
Login incorrect. Try again.
Login:
Password:
Login incorrect. Try again.
Login:
Password:
Authorization failed after trying 3 times!!!.
Login: Password:
Login incorrect. Try again.
Login:
Password:
Login incorrect. Try again.
Login:
Password:
Authorization failed after trying 3 times!!!.
Login:
Password:
Login incorrect. Try again.
スクリプト内で送信すると、eof
スクリプトはきちんと終了します。
Expect スクリプトは bash スクリプトから呼び出されます。
#!/bin/bash
for host in $(cat ipnmap.txt);do
echo "${host}";
/usr/bin/expect passchange1.sh $host
done
私は同じ機能を達成するためにExpectを使用できることを知っていますが、bashで行うことを好みます。
必要なのは、ルーターが2番目に資格情報を要求した場合、スクリプトは次のIPに移動する必要があることです。なぜなら、最初に失敗すると、ルータに私たちが望むデフォルトのパスワードがないという意味だからです。する。必要に応じて、次のIP /ルーターに移動できます(パスワードの変更は、ルーターにデフォルトのユーザー名/パスワードがある場合にのみ必要です)。
この問題を解決するためのガイドラインを提供していただきありがとうございます。ありがとう
答え1
すべてを1つのステートメントに入れるのではなく、ログインの各部分を別々の一致に単純に分散させることができます。expect
特に、どのシーケンスが得られるかを知っている場合は、応答を一度にできるだけ多くの項目を処理する必要はありません。たとえば、
#!/usr/bin/expect
proc abort { } { send_user "Timeout!" ; exit 2 }
set address [lindex $argv 0]
spawn telnet $address
expect timeout abort "Login: "
set timeout 5
send "ABC\r"
expect timeout abort "Password: "
send "ABC\r"
expect timeout abort "Login incorrect" exit "> "
send "passwd\r"
expect timeout abort "Username: "
send "ABC\r"
expect timeout abort "Password: "
send "ABC\r"
expect timeout abort "New Password: "
send "n3wp@ss\r"
expect timeout abort "Confirm New Password: "
send "n3wp@ss\r"
expect timeout abort "> "
send "save\r"
expect timeout abort "> "
send "quit\r"
expect timeout abort eof
abort
このスクリプトはメッセージを印刷し、呼び出し時に戻りコード2で終了する関数を作成します。変数をaddress
スクリプトに渡される最初の引数に設定します。 telnetコマンドを起動してexpect
ログインプロンプトを実行するかタイムアウトします(デフォルトのタイムアウトは10秒です。後で5秒に設定します)。timeout
パターンではなく特別なキーワードです。 Expect コマンドの形式は次のとおりです。モードコマンドモードコマンド...。最後のコマンドは省略できます。つまり、スクリプトの次の行に移動します。これは複数行に対応します。
expect {
timeout abort
"Login incorrect" exit
"> "
}
ログインプロンプトが表示されない場合は、タイムアウトによって中断と終了が呼び出され、bashスクリプトでこの失敗をテストできます。
メッセージが表示されたら、ユーザーIDとパスワードを順番に送信します。 「無効なログイン」が受信されると終了します(終了コード0)。これは、パスワードがデフォルトのパスワードではないことを意味します。それ以外の場合は、ログインしてプロンプトを確認して>
設定を続行します。最後に、quit
接続を完全に閉じてexpect eof
閉じるまで待つために送信できるいくつかの便利なコマンドがあります。