4

我有一个期望脚本,我目前正在其中寻找多种提示类型并发送命令作为响应。我知道使用“-re”进行正则表达式匹配,但我想知道实现这一点的正确方法。

例如,我有这些提示类型:

[user@hostname ~]#
user@hostname --->
/ >
-bash-3.00$ 
cli>

这是检测上述所有内容的正确/充分表达吗?

set multiPrompt "(%|#|cli\>|\$|\-\-\-\>)"
expect -re $multiPrompt
send "$someCommand\r"

另外,我有一个命令列表,其中一些命令在远程系统上执行后会导致提示发生变化。由于提示的更改,剩余的命令没有被发送,因为我的期望脚本无法检测到更改并执行发送操作。

我要做的是创建一个可能的提示池,以便我的期望脚本发送命令而不会丢失任何一个。我的方法正确吗?

4

2 回答 2

4

虽然使用正则表达式来检测提示是正确的,但当您有如此广泛的可能性时,选择一个好的提示是很棘手的。例如,我打赌这个 RE 会起作用:

set multiPrompt {[#>$] }

(它只是检测提示符的结尾,并忽略它之前的所有内容。提示符末尾几乎总是有一个空格,用于在视觉上将用户键入的内容与提示符分开。)

然而,问题是这个 RE 很可能匹配其他的东西。相反,您最好将提示更改为已知且唯一的值(通常通过PS1在远程设备上设置环境变量),以便获得可靠的检测。请注意,这仅适用于您不向用户公开提示的情况,这对于 expect 的某些用途是正确的,而不是其他用途……</p>

于 2013-04-26T08:55:06.560 回答
1

我知道这是一个旧线程,但对于任何搜索此问题的人,我希望这会有所帮助。我是一名 UNIX 系统管理员,我的程序为各种管理功能调用了一些期望脚本。这是我发现的一种适用于我所有用例的解决方案:

set prompt "(%|#|>|\\$ )"

set prompt [string trim $prompt]

处理一些提示在[string trim $prompt]输入前有空格而一些没有在查看提示时修剪空格的情况。示例:“密码:”与“密码:”

于 2016-02-05T15:00:56.407 回答