방금 기대를 사용하기 시작했습니다. 서버에서 토큰을 가져오기 위해 다음 코드를 실행하고 있습니다.
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}
}
이제 이것은 이전에 실패한 스위치에 대해 잘 작동합니다. 이 두 가지 상황을 어떻게 처리해야 합니까?
답변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}
}