大家好
我刚刚找到了造成这些奇怪事情的原因。这是命令:发送“等待”
我编写了一些脚本来测试它。
proc Login {pass} {
# send the password
}
proc Wait {} {
expect "*]$*"
sleep 1
}
proc sendl {message} {
send "$message\r"
}
spawn ssh xxxxx.xxx.xxx
Login xxxxxxxx
Wait
sendl "cd /somepath/"
Wait
sendl "expect infiniteLoop.exp >/dev/null &"
Wait
***sendl "wait"***
Wait
sendl "TESTTEST"
Wait
sendl "HAHAHA"
Wait
sendl "DONEDONEDONE"
Wait
它应该卡在以下行之后:sendl“wait”
但结果是:
[xxx@xxxxx.xxx ~]$ cd /somepath/
[xxx@xxxxx.xxx folder]$ expect infiniteLoop.exp >/dev/null &
[1] 27260
[xxx@xxxxx.xxx folder]$ wait
TESTTEST
HAHAHA
DONEDONEDONE
[xxx@xxxxx.xxx folder]$
shell还在等待,但后续命令已经一一发出去,没有任何反应。该行之后的所有期望命令似乎都是无效的。然后脚本就完成了。
我不知道这里发生了什么。什么原因导致expect命令无效?命令“wait”似乎不是一个程序(我无法使用“whereis wait”找到它)。
[xxx@xxxxx.xxx folder]$ wait
TESTTEST
HAHAHA
DONEDONEDONE
这种输出很可能是expect超时造成的。
我不确定infiniteLoop.exp在做什么。如果它实际上是一个无限循环(或需要很长时间的事情),则以下 wait
shell 命令将始终等待,因为进程(infiniteLoop.exp)永远不会终止。
因此,以下 Wait()
过程调用最终将在每 10 秒后超时(10 秒是 Expect 默认超时),并且脚本将继续执行,如下所示:
sendl "TESTTEST" (send message to spawned process)
Wait (process still waiting for infiniteLoop.exp, timeout after 10s.)
sendl "HAHAHA" (continue to send message)
Wait (process still waiting for infiniteLoop.exp, timeout after 10s.)
sendl "DONEDONEDONE" (continue to send message)
当 Expect 脚本没有按预期进行调整时,我总是做两件事:
顺便说一句,您可以添加一些检查来指示超时情况
proc Wait {} {
expect {
"$" {}
timeout {send_user "expect timeout\n"}
}
sleep 1
}
我是一名优秀的程序员,十分优秀!