期待错误处理 - spawn id未打开
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了期待错误处理 - spawn id未打开相关的知识,希望对你有一定的参考价值。
我正在编写一个期望脚本,可以在数百个路由器中注销并更改其配置。
我的问题是,路由器固件存在一个错误,导致密码发送后关闭连接。如果我再次登录,它可以正常工作(因此只有重新启动后的第一次登录才会导致异常)。当连接关闭时,期望脚本终止。
我想如果我可以优雅地捕获异常,并再试一次。
失败的代码是这部分:
# go through each IP
for {set i $start} {$i <= $end} {incr i} {
set ip "10.$octet2.$i.x"
puts "
#### doing $ip...
" ; flush stdout
# log in to the IP
spawn ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -l $user $ip
expect {
"continue connecting (yes/no)?" { send "yes
" ; exp_continue }
"login as: " { send "$user
" ; exp_continue }
"Password: " { send "$pwd
" }
"No route to host" { continue }
timeout { continue }
}
# execute commands from file
foreach c "$commands" { eval $c }
}
我得到的错误看起来像这样:
Password:
Connection to 10.x.x.x closed by remote host.
Connection to 10.x.x.x closed.
send: spawn id exp11 not open
while executing
"send "exit
""
("eval" body line 1)
invoked from within
"eval $c "
("foreach" body line 1)
invoked from within
"foreach c "$commands" { eval $c }"
("for" body line 18)
invoked from within
"for {set i $start} {$i <= $end} {incr i} {
set ip "10.$octet2.$i.x"
puts "
#### doing $ip...
" ; flush stdout
# log in to the IP
spa..."
(file "./multido.exp" line 39)
任何帮助真的很感激!
答案
您可以使用tcl命令catch
来捕获异常,以包围可能出错的命令。您可以将代码的内部循环扩展为类似于:
set tryrun 1
while {$tryrun} {
spawn ssh ...
expect ...
set tryrun 0
foreach c "$commands" {
if {[catch {eval $c} result]} {
puts "failed: $result"
set tryrun 1
}
}
}
也许更简单的解决方案是在您期望中寻找模式"closed by remote host"
,并使用它来重复类似的循环。
以上是关于期待错误处理 - spawn id未打开的主要内容,如果未能解决你的问题,请参考以下文章
posix_spawn() :使用 posix_spawn() 时的错误处理问题
events.js: 141 投掷者; // 未处理的“错误”事件
使用 boost::asio::spawn 生成的 asio 处理程序中的 boost::property_tree::read_xml 段错误
youtube-dl nodejs 有问题 Error: spawn EACCES
MySQL 5.5 '二进制日志未打开',错误代码:1236
错误代码:错误域 = NSCocoaErrorDomain 代码 = 3840“JSON 文本没有以数组或对象和允许未设置片段的选项开头。”