【发布时间】:2019-08-03 07:08:57
【问题描述】:
我将在我第一次与 Expect 合作时作为序言,到目前为止我非常喜欢它!除了 timeout、eof 以及输出消息或根本没有消息之外,您如何制作?
我有一个从 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) 返回空白,这是有道理的。
我想我对如何解决这个问题来处理这种特定情况感到困惑。我无权更改错误处理,否则我觉得我只想让它返回某种成功消息。接受有关如何处理这种情况或替代方法的任何提示。
【问题讨论】:
-
您需要考虑在“没有输出”时将写入脚本的内容。用户如何确定程序(您尝试自动化的程序)没有产生输出,而只是挂起?有时,这可以通过检测提示或类似的东西来实现……