在expect脚本中的第二个“发送”命令不等待完成第一个命令的输出

时间:2014-03-06 10:14:02

标签: linux expect

我有一个非常小的期望脚本。流程如下

  1. ssh到远程计算机
  2. 执行命令,执行命令后,您将出现另一个提示(提示名称为Enter cmd>
  3. Enter cmd>提示符下,我需要运行许多命令
  4. 因此我设计了这个脚本

    #!/usr/bin/expect
    
     set FULL_CMD { #cmd1 #cmd2 #cmd3  }
     puts "STARTING......."
    
     log_file myfile.log ;# <<< === append output to a file
     spawn ssh tempuser\@dummyserver
     match_max  100000000
    
     expect "password:"
     send "temppasswd\r"
    expect  "*temp*"
     send "cd \/home\r"
     expect "*temp*"
    send "new cmd prompt\r"
    expect "Enter cmd>"
    
    foreach tempcmd $FULL_CMD {
     send "${tempcmd} \r "
     expect -exact  "Enter cmd>\r"
     send -- "\r"
    expect eof }
    
    send "q"
    send "exit\r"
    
    puts "I HAVE ENDED......."
    

    我的问题:实际上第一个命令cmd#1的O / P很长,我可以看到期望脚本没有等待第一个命令完成的O / P并在一段时间后发送第二个命令cmd#2

    此脚本在cmd#1的O / P很小的系统上运行良好,但在cmd#1的O / P非常大(比如1000000行)的系统上,它有问题,即它发出第一个命令cmd#1,然后是O / P,但在它返回Enter cmd>提示符之前,脚本发出第二个命令cmd#2

    如何确保仅在cmd#2的输出完成后才发送命令cmd#1

3 个答案:

答案 0 :(得分:5)

尝试在开始时设置超时:

set timeout 60

或使用-1永远等待。

答案 1 :(得分:0)

为什么你的for循环中有“期望eof”?

foreach tempcmd $FULL_CMD {
  send "$tempcmd\r"
  expect "Enter cmd>"
  send -- "\r"         # why do you need this?
}

在开发程序时,启用调试很聪明:将其添加到顶部附近:exp_internal 1

答案 2 :(得分:0)

问题在于你的foreach tempcmd $FULL_CMD循环:

foreach tempcmd $FULL_CMD {
  send "${tempcmd} \r "
  expect -exact  "Enter cmd>\r"
  send -- "\r"
expect eof }

问题在于您expect "Enter cmd>\r" \r,但您的输出中永远不会得到expect

"Enter cmd>$" $应该是什么or '\r' or意味着当前命令输出的结束(而不是&#39; \ n foreach tempcmd $FULL_CMD { send "${tempcmd} \r " expect -exact "Enter cmd>$" # Check for spaces after '>' and fix as required send -- "\r" # expect eof } eof`)

expect eof

对于{{1}},它匹配连接到生成进程输出的输入流的末尾。它只会在生成的进程终止后匹配,因此在这里没用[/ p>