Команда тайм-аута в разделе "Ожидание" не работает должным образом - PullRequest
0 голосов
/ 08 мая 2020

Я новичок в этом сообществе, а также в программировании. В настоящее время я работаю над простым сценарием Expect, который считывает файл со списком DNS-имен S SH в маршрутизатор Cisco и выполняет простую команду «show ip intrief».

Этот список содержит некоторые хосты, которые в данный момент недоступны, поэтому я пытаюсь заставить сценарий отключить это недостижимое устройство, но продолжить работу с остальными устройствами.

Когда я запускаю сценарий, он может S SH подключиться к первому устройству и выполнить команду «show». Однако когда он достигает второго устройства (которое недоступно), он зависает там примерно на 30 секунд, а затем завершает сценарий. Я не уверен, что делаю не так. Будем очень благодарны любой помощи.

#!/usr/bin/expect
#
#
set workingdir cisco/rtr
puts stdout "Enter TACACS Username:"
gets stdin tacuserid
system stty -echo
puts stdout "Enter TACACS password:"
gets stdin tacpswd
puts stdout "\nEnter enable password:"
gets stdin enabpswd
system stty echo
#
set RTR [open "$workingdir/IP-List.txt" r]
set timestamp [timestamp -format %Y-%m-%d_%H:%M]
#
while {[gets $RTR dnsname] != -1} {
if {[ string range $dnsname 0 0 ] != "#"} {
        send_user "The value of the router name is $dnsname\n"
        set timeout 10
        set count 0
        log_file -a -noappend $workingdir/session_$dnsname\_$timestamp.log
        send_log "### /START-SSH-SESSION/ IP: $dnsname @ [exec date] ###\n"
        spawn ssh -o StrictHostKeyChecking=no -l $tacuserid $dnsname
expect {

        "TACACS Password: " {send "$tacpswd\r"}
        timeout             {puts "$dnsname - failed to login"; wait;close;exp_continue}
        }
expect {
        {>}                 {send "enable\r"; send_user "on the second expect\n"}
                }
expect {
       {assword: }          {send "$enabpswd\r"}
       }
#
expect {
        "#"                 {send "show ip int brief\r"}
       }
#expect "#"
send "exit\r"
send_log "\n"
send_log "### /END-SSH-SESSION/ IP: $dnsname @ [exec date] ###\n"
log_file
        }
}
exit

1 Ответ

0 голосов
/ 08 мая 2020

Ваше первое ожидание - это

expect {...
  timeout {puts "..."; wait; close; exp_continue}
}

Это будет соответствовать, когда ssh требуется более 10 секунд для подключения к хосту. Когда это совпадает, он неизбежно завершается с ошибкой ( id спауна ... не открывается ). Это связано с тем, что вы ждете завершения команды, закрываете соединение спауна, а затем перезапускаете ту же команду expect.

Вероятно, вы хотели использовать continue вместо exp_continue, чтобы продолжить while l oop.

...