Expect 下的超时命令未按预期工作
Timeout Command under Expect not Working as Expected
我是这个社区的新手,也是编程新手。我目前正在开发一个简单的 Expect 脚本,它读取一个包含 DNS 名称列表的文件,通过 SSH 连接到 Cisco 路由器,并执行一个简单的 "show ip int brief"。
此列表包含一些目前无法访问的主机,因此我试图让脚本使无法访问的设备超时,但继续处理其余设备。
当我 运行 脚本时,它能够通过 SSH 连接到第一台设备并执行 "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
你的第一个期望是
expect {...
timeout {puts "..."; wait; close; exp_continue}
}
当 ssh
连接到主机的时间超过 10 秒时,这将匹配。
当这匹配时,它不可避免地退出并出现错误(spawn id ... not open)。这是因为您等待命令结束,关闭 spawn 连接,然后重新启动相同的 expect 命令。
您可能打算使用 continue
而不是 exp_continue
,以便继续封闭的 while
循环。
我是这个社区的新手,也是编程新手。我目前正在开发一个简单的 Expect 脚本,它读取一个包含 DNS 名称列表的文件,通过 SSH 连接到 Cisco 路由器,并执行一个简单的 "show ip int brief"。
此列表包含一些目前无法访问的主机,因此我试图让脚本使无法访问的设备超时,但继续处理其余设备。
当我 运行 脚本时,它能够通过 SSH 连接到第一台设备并执行 "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
你的第一个期望是
expect {...
timeout {puts "..."; wait; close; exp_continue}
}
当 ssh
连接到主机的时间超过 10 秒时,这将匹配。
当这匹配时,它不可避免地退出并出现错误(spawn id ... not open)。这是因为您等待命令结束,关闭 spawn 连接,然后重新启动相同的 expect 命令。
您可能打算使用 continue
而不是 exp_continue
,以便继续封闭的 while
循环。