我正在复制我脚本的最小工作示例。它可以在大多数时间内正常工作,直到很多天,直到遇到由于某种原因拒绝连接的主机。在这种情况下,脚本会停止。我希望脚本忽略任何此类事件并继续到列表中的下一个主机。有关如何在expect脚本中处理此类错误的任何想法?
#!/usr/bin/expect -f
set timeout 5
# The script runs forever.
while {1} {
# There is a long list of IPs, keeping only two for simplicity.
set servers [list 172.22.29.254 172.22.2.125 ]
foreach server $servers {
# Creates a file depending on time and IP.
set fh [exec date +%Y-%m-%d--%H:%M:%S_$server]
# Telnets a remote host
spawn telnet $server
expect Password:
exp_send "password\r"
# Copies whatever is there.
expect ".*"
expect -re ".*\r"
# Opens the above created file and writes there.
set file [open $fh w]
puts $file $expect_out(buffer)\n
close $file
# Connection is now closed.
exp_close
exp_wait
}
}
答案 0 :(得分:0)
问题是你没有做任何错误检查。您以完全线性的方式使用expect
命令:等待模式,发送下一条消息。但是,当在任何给定步骤中处理多个可能的模式时,这不能很好地工作。
幸运的是,expect
命令允许您同时指定一组模式,并为每个模式执行操作。
例如:
foreach server $servers {
set fh [clock format [clock seconds] -format "%Y-%m-%d--%H:%M:%S_$server"]
spawn telnet $server
expect {
"word:" { send "$password\r" }
"Connection refused" { catch {exp_close}; exp_wait; continue }
eof { exp_wait; continue }
}
expect ".*"
.... rest of script goes here ....
}
正如您所看到的,当我告诉expect
命令查找密码提示并使用密码回复时,我也告诉它如果我收到“拒绝连接”消息,继续生活,如果telnet命令因某些其他原因而死,而不是要求输入密码,那么继续开展业务。
以这种方式试试,看看它是如何运作的。