ちょうど期待を使い始めました。サーバーからトークンを取得するために、次のコードを実行しています。
set timeout 20
set token ""
sleep 1
spawn ssh -l $serveruser1 $serverip
# -- is used to disable the interpretion of flags by Expect.
expect {
-re "OK" {
send_user "** Enter command to get the token. **\n"
send -- "-t $switchtype -s h -c \[Long_CLLI:$switchname\] -u $switchuser -l auto-sarm -e n \r"
}
timeout {
send_user "** Session timeout on $serverip upon LOGIN**\n"
exit -1
}
}
sleep 1
expect {
-indices -re "\n.+\n(.+\@)" {
set token $expect_out(1,string)
send_user "**Get the token $token **\n"}
timeout {
send_user "** Session timeout upon getting token**"
exit -1}
}
このコードはほとんどのスイッチで正常に動作しますが、一部のスイッチではRE006コードのため失敗します。したがって、これらのスイッチではスイッチの種類を変更する必要があります。次のように変更しました。
set timeout 60
set token ""
sleep 1
spawn ssh -l $serveruser1 $serverip
# -- is used to disable the interpretion of flags by Expect.
expect {
-re "OK" {
send_user "** Enter command to get the token. **\n"
send -- "-t $switchtype -s h -c \[Long_CLLI:$switchname\] -u $switchuser -l auto-sarm -e n \r"
}
timeout {
send_user "** Session timeout on $serverip upon LOGIN**\n"
exit -1
}
}
sleep 1
expect {
-re "RE006" {
send_user "** Enter command to get the token. **\n"
send -- "-t $switchtype1 -s h -c \[Long_CLLI:$switchname\] -u $switchuser -l auto-sarm -e n \r"
}
timeout {
send_user "** Session timeout on $serverip upon LOGIN**\n"
exit -1
}
}
expect {
-indices -re "\n.+\n(.+\@)" {
set token $expect_out(1,string)
send_user "**Get the token $token **\n"}
timeout {
send_user "** Session timeout upon getting token**"
exit -1}
}
これで、これは以前に失敗したスイッチに対してうまく機能します。この2つの状況をどのように処理する必要がありますか?
答え1
これは推測であり、追加情報が必要です。通常、プロンプトを見つけるコマンドを使用してビルドしますが、プロンプトがどのように見えるかわからないため、実行中であると推定されるOPプログラムを調整しました。
主な変更点はRE006を探し、表示されている場合は目的のコマンドを出力してからexp_continueを実行して、現在予想されているステートメントを繰り返すことです。これは通常、タイムアウトの短いRE006を探し、タイムアウト時に何もしないよりも優れています。
set timeout 60
set token ""
spawn ssh -l $serveruser1 $serverip
# -- is used to disable the interpretion of flags by Expect.
expect {
-re "OK" {
send_user "** Enter command to get the token. **\n"
send -- "-t $switchtype -s h -c \[Long_CLLI:$switchname\] -u $switchuser -l auto-sarm -e n \r"
}
timeout {
send_user "** Session timeout on $serverip upon LOGIN**\n"
exit -1
}
}
# If we get a RE006 code in response to sending "-t $switchtype" then
# send a "-t $switchtype1".
# We then look for at least two lines of output, the first being non-empty
# and the second having a "@" character in it and at least one character before
# the "@". If there is more that one "@" on the second line all the text up
# to the last "@" inclusive will be returned as the token.
expect {
"RE006" {
send_user "Got RE006 response, switching to alternative switchtype\n"
send -- "-t $switchtype1 -s h -c \[Long_CLLI:$switchname\] -u $switchuser -l auto-sarm -e n \r"
exp_continue}
-re "\n.+\n(.+\@)" {
set token $expect_out(1,string)
send_user "**Get the token $token **\n"}
timeout {
send_user "** Session timeout upon getting token**"
exit -1}
}