0

这是我拥有的代码,我解释了我希望它如何在底部工作。

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 "root\r"

expect "Password:"

send "root\r"

expect "#"

send "shutdown -r now\r"

expect "#"

send "exit\r"

expect "Connection closed by foreign host."


set timeout 20

spawn telnet $12

expect "login:"

send "root\r"

expect "Password:"

send "root\r"

expect "#"

send "shutdown -r now\r"

expect "#"

send "exit\r"

expect "Connection closed by foreign host."

exit

如您所见,我使用它每周使用 crontab 重新启动设备一次,但如果设备没有响应或离线,脚本将在 {exit} 处停止,
所以我想使用 goto 命令或类似命令来运行列表中的下一个 spawn 命令。如果没有 goto 命令,有什么简单的方法可以做到这一点?

4

1 回答 1

0

也许您可以在登录提示成功匹配后执行的代码块中包含第一台服务器的所有命令交换?

类似于以下内容:

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 "root\r"
        expect "Password:"
        send "root\r"
        expect "#"
        send "shutdown -r now\r"
        expect "#"
        send "exit\r"
        expect "Connection closed by foreign host."
     }
}

spawn telnet $12
[...]

如果在尝试连接到 $11 后您得到“无法连接...”,它将执行空块并继续。如果它与“login:”匹配,它将执行所有命令。

您需要检查您的 telnet 在“无法连接”消息后是否成功关闭(我认为确实如此),这样您就不会产生多个生成的会话。

于 2013-11-12T18:24:13.107 回答