0

大家好

我刚刚找到了导致这些奇怪事情的原因。这是命令:发送“等待”

我写了一些脚本来测试它。

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还在等待,但是后续的命令已经一一发出,没有任何反应。该行之后的所有期望命令似乎都是无效的。然后脚本就完成了。

我不知道这里发生了什么。什么原因导致期望命令无效?命令“wait”似乎不是一个程序(我不能使用“whereis wait”找到它)。

4

1 回答 1

0
[xxx@xxxxx.xxx folder]$ wait
TESTTEST
HAHAHA
DONEDONEDONE

这种输出很可能是expect timeout造成的。

我不确定infiniteLoop.exp 在做什么。如果它实际上是一个无限循环(或需要很长时间),则以下waitshell 命令将始终等待,因为 process(infiniteLoop.exp) 永远不会终止。

因此,以下Wait()proc 调用最终将在每 10 秒后超时(10 秒是预期的默认超时),脚本将继续如下:

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 脚本没有按预期调整时,我总是做两件事:

  • 第一个是手动运行程序以检查是否有问题。

  • 第二个是添加-d选项以打开调试消息(例如:)expect -d hello.exp。如果您看到类似“expect: timed out”的内容,那么之前的模式可能无法匹配。

顺便说一句,您可以添加一点检查以指示超时情况

proc Wait {} {
    expect {
        "$" {}
        timeout {send_user "expect timeout\n"}
    }
    sleep 1
}
于 2012-10-05T03:44:46.307 回答