【问题标题】:Expect checking for a string or no output at all期望检查字符串或根本没有输出
【发布时间】:2019-08-03 07:08:57
【问题描述】:

我将在我第一次与 Expect 合作时作为序言,到目前为止我非常喜欢它!除了 timeouteof 以及输出消息或根本没有消息之外,您如何制作?

我有一个从 bash 脚本触发的期望脚本。 expect 脚本仅用于 ssh 到服务器并执行用户删除。如果删除不成功,则会出现$username does not exist 的错误消息,然后是一个新的空白输入行。但是,如果操作成功,则不会返回任何消息,并立即跳转到新的空白输入行以执行下一个操作。

我找到了a similar stack post,了解如何处理可能的输出,尽管我在实施不返回输出的解决方案时遇到了麻烦。这是迄今为止我最好的尝试的一个sn-p:

send "userdel $userdel_username\r"

expect {
  timeout { send_user "timeout on deletion\n"; exit 1}
  eof { puts "received eof\n"; exit 1}
  -re "^.*(?=exist).*\$" { set userdel_fail 1;} # easy way to check for the error
  -re "\$.*" { set userdel_fail 0;}
}

if {$userdel_fail == 1} {
    send_user "$userdel_username does not exist"
} else {
    send_user "$userdel_username deleted successfully"
}

这个解决方案总是命中期望块的最后一行,因为总会有输入。我已经尝试完全忽略-re "\$.*" { set userdel_fail 0;},但这会导致每次成功删除都会击中timeout。如果我省略了正则表达式来检查错误并且只期望输入,我发现$expect_out(buffer) 返回空白,这是有道理的。

我想我对如何解决这个问题来处理这种特定情况感到困惑。我无权更改错误处理,否则我觉得我只想让它返回某种成功消息。接受有关如何处理这种情况或替代方法的任何提示。

【问题讨论】:

  • 您需要考虑在“没有输出”时将写入脚本的内容。用户如何确定程序(您尝试自动化的程序)没有产生输出,而只是挂起?有时,这可以通过检测提示或类似的东西来实现……

标签: shell tcl expect


【解决方案1】:

您可以让远程命令在成功时生成一些文本,以便您在 expect 脚本中匹配该文本。

例如:

send "userdel $userdel_username && echo SUCCESS\r"

【讨论】:

    猜你喜欢
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 2020-07-27
    • 2015-01-21
    相关资源
    最近更新 更多