这是我的代码,我在底部解释了我希望它如何工作。
set 11 "10.0.0.101"
set 12 "10.0.0.12"
set timeout 20
spawn telnet $11
expect {
"Unable to connect to remote host:" {exit}
"login:"
}
send "rootr"
expect "Password:"
send "rootr"
expect "#"
send "shutdown -r nowr"
expect "#"
send "exitr"
expect "Connection closed by foreign host."
set timeout 20
spawn telnet $12
expect "login:"
send "rootr"
expect "Password:"
send "rootr"
expect "#"
send "shutdown -r nowr"
expect "#"
send "exitr"
expect "Connection closed by foreign host."
exit
如您所见,我使用它每周使用 crontab 重新启动设备一次,但如果设备没有响应或离线,脚本只会在 {exit}
停止所以我想使用 like goto 命令或类似命令来运行列表中的下一个 spawn 命令。如果没有goto命令,有什么简单的方法可以做到这一点吗?
也许您可以将第一个服务器的所有命令交换包含在成功匹配登录提示后执行的代码块中?
如下所示:
set 11 "10.0.0.101"
set 12 "10.0.0.12"
set timeout 20
spawn telnet $11
expect {
"Unable to connect to remote host:" { }
"login:" {
send "rootr"
expect "Password:"
send "rootr"
expect "#"
send "shutdown -r nowr"
expect "#"
send "exitr"
expect "Connection closed by foreign host."
}
}
spawn telnet $12
[...]
如果在尝试连接到 $11 后您收到"无法连接...",它将执行空块并继续前进。如果它与"登录:"匹配,它将执行所有命令。
您需要检查您的 telnet 是否在"无法连接"消息后成功关闭(我认为确实如此),这样您就不会最终生成多个会话。