【问题标题】:Expect doesn't recognize command "timeout" in loopExpect 无法识别循环中的命令“超时”
【发布时间】:2018-06-25 22:18:25
【问题描述】:

我有一个期望脚本来检查登录状态,如果控制台显示"poplar login", 脚本将发送用户名(无密码)并等待 180 秒以使系统准备好。 一旦系统准备就绪,它将检查控制台是否显示"root@poplar",如果是,它将中断并发送success 消息。如果没有,expect 将超时并返回到"poplar login"

我的脚本

set timeout 2 
expect {
            "poplar login" {
               send "root\r";
               sleep 180; send "\r" ;
               send "\r" ;
               exp_continue
            }
            "root@poplar"
            timeout { send "\r" ; exp_continue }
} 

send_user "login success!\n"

expect总是不读取超时,日志就像follow

 expect: does"\r\n\u001b[r\u001b[m\u001b[2J\u001b[H\u001b[?7h\u001b[?1;4;6l
 \u001b[?1049h\u001b[4l\u001b[?1h\u001b=\u001b[0m\u001b(B\u001b[1;70r\u001b[H
 \u001b[2J\u001b[H\u001b[2J"(spawn_id exp5) match glob pattern "poplar login"? no
 "root@poplar"? no 
 " send "\r" ; exp_continue "? no
 expect: timed out
 login success! 
 send: sending "reboot\r" to { exp5 }

请帮忙,谢谢

【问题讨论】:

  • 你提到了"poplar@login",但在你的代码中是"poplar login"
  • @pynexj 抱歉打错了,已修改

标签: expect


【解决方案1】:

改变

"root@poplar"
timeout { send "\r" ; exp_continue }

"root@poplar" {}
timeout { send "\r" ; exp_continue }

或者它会被处理为

"root@poplar" timeout
{ send "\r" ; exp_continue }

这就是您看到调试消息的原因

" send "\r" ; exp_continue "? no

因为{ send "\r" ; exp_continue } 部分是作为 PATTERN 处理的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多