我有一个使用Expect与多台PC交互的基础设施(一些是Windows 7 [通过cygwin],另一些是Ubuntu 12)。
有时,expect命令会挂起,直到达到超时。
然后,我注意到并非所有命令都已发送到目标PC - 我随exp_send
发送的字符串被任意截断。
例如,如果提示字符串为root@myPC:/#
且命令为echo "Hello World!"
,那么在expect_out(buffer)
中我可能会看到如下内容:
echo "Hroot@myPC:/#
我确认该命令尚未在目标PC中执行。
你知道发生这种情况的可能原因是什么吗? 另外,是否可以防止这种情况?
Expect脚本作为Tcl 8.5脚本的一部分执行。
编辑#1,11.02.2014 15:04 UTC:
请参阅this debug output of expect(为了便于阅读而修剪)。
您可以看到exp_send
发送了字符(\r
),但没有收到任何内容
这主要发生在向ssh提供密码之后。
我认为它可能与this problem有关 - 对于某些NAT路由器,ssh挂起,因为它在验证用户之后立即设置IP数据包的TOS字段。
这是ssh的(级别3)调试输出:
root@1.2.3.4 's password:
debug3: packet_send2: adding 64 (len 55 padlen 9 extra_pad 64)
debug2: we sent a password packet, wait for reply
pa$$w0rd
debug1: Authentication succeeded (password).
Authenticated to 1.2.3.4 ([1.2.3.4]:22).
debug1: channel 0: new [client-session]
debug3: ssh_session2_open: channel_new: 0
debug2: channel 0: send open
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug2: callback start
debug2: client_session2_setup: id 0
debug2: fd 3 setting TCP_NODELAY
debug3: packet_set_tos: set IP_TOS 0x10
debug2: channel 0: request pty-req confirm 1