期望抱怨发送:spawn id exp6未打开



我使用一个脚本自动地通过Telnet登录并在远程设备上运行一些命令。但是下面的代码片段不能正常工作。

脚本如下:

expect << EOS
log_user 0;
spawn telnet 192.168.1.51 -l root
expect "#"
send "ls; pwd;r"
log_user 1;
expect "#"
log_user 0;
send "exitr"
expect eof
EOS

下面是上面代码片段正常工作时的输出:

ls; pwd;
testprogram
/root

下面是出错时的输出:

send: spawn id exp6 not open
while executing
"send "ls; pwd;r""

然后我尝试运行expect -d以获得额外的调试输出。

以下是启用-d时的输出:

expect version 5.45.3
argv[0] = expect  argv[1] = -d  
set argc 0
set argv0 "expect"
set argv ""
executing commands from command file
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {95242}
expect: does "" (spawn_id exp6) match glob pattern "#"? no
expect: does "Trying 192.168.1.51...rn" (spawn_id exp6) match glob pattern "#"? no
expect: does "Trying 192.168.1.51...rnConnected to 192.168.1.51.rnEscape character is '^]'.rn" (spawn_id exp6) match glob pattern "#"? no
expect: does "Trying 192.168.1.51...rnConnected to 192.168.1.51.rnEscape character is '^]'.rnConnection closed by foreign host.rn" (spawn_id exp6) match glob pattern "#"? no
expect: read eof
expect: set expect_out(spawn_id) "exp6"
expect: set expect_out(buffer) "Trying 192.168.1.51...rnConnected to 192.168.1.51.rnEscape character is '^]'.rnConnection closed by foreign host.rn"
send: sending "ls; pwd;r" to { exp6 send: spawn id exp6 not open
while executing
"send "ls; pwd;r""

已更新检查Connection closed by foreign host.

衷心感谢@glenn jackman。

我添加了expect_before来匹配Connection closed by foreign host.,一旦expect被调用。但是又出现了一个问题,即使这个脚本成功地完成了它的工作,这个脚本也会打印出Telnet session closed unexpectedly. Please try again.,然后调用send "exitr"; expect eof

是否有任何方法使expect_before不再工作时,最后一个expect命令(即:expect eof)要调用吗?

简单地删除expect eof似乎是实现这一目标的一种方法。但在我看来,这不是一个好的解决方案。


expect  << EOS
log_user 0;
spawn telnet 192.168.1.51 -l root
expect_before {
"Connection closed by foreign host." {
puts "Telnet session closed unexpectedly."
puts "Please try again."
exit
}
exp_continue
}

expect "#"
send "ls; pwd;r"
log_user 1;
expect "#"
log_user 0;
send "exitr"
expect eof
EOS

以下是脚本成功完成其工作(然后称为send "exitr"; expect eof)时的输出:

ls; pwd;
testprogram
/root
# Telnet session closed unexpectedly.
Please try again.

注意"连接已被外部主机关闭";

spawn telnet 192.168.1.51 -l root
expect {
"Connection closed by foreign host." {
puts "Telnet session closed unexpectedly."
puts "Please try again."
exit
}
"#"
}
对于这种形式的expect命令,expect正在查找两个模式,第一个发现"wins"
  • if"连接已关闭";发生,则打印消息并结束程序
  • 如果"#";(你的提示)显示,没有具体的动作,所以expect命令返回,程序的其余部分可以继续

对于经常需要查找多个模式的高效期望编程来说,这项技术是必不可少的。


展望未来,您可能期望看到"连接已关闭";查询expect_before命令

最新更新