我在 Linux 服务器上编写了一个 Expect 脚本,该脚本应该远程登录到路由器以收集一些系统信息。到目前为止,我的脚本可以成功建立连接、运行路由器命令、断开连接并终止。
该命令显示了几行我需要解析的内容,我不确定如何在 Expect 中执行。如何保存输出,grep 一行,然后从行中提取一列,最后将结果保存在文件中?如果可能的话,我想完全使用 Expect 而不是变通方法(例如 Expect 嵌入在 Bash 中)。
谢谢你的时间。jk04
期望开发的两个技巧:
autoexpect
为您的自动化设计一个框架exp_internal 1
详细地显示期望在内部做什么。当您无法弄清楚为什么您的正则表达式没有捕获您的期望时,这个是必不可少的。基本上,$expect_out(buffer) [1]。将最后一个期望匹配的输出保存到当前匹配。你可以在那里找到你的命令输出。
对于字符串操作,您可以简单地使用 tcl 的内置 [2][3]。
我遇到并解决了与 bash 交互的类似问题。我相信该方法可以推广到任何其他提供无操作、固定字符串输出的交互式环境。
基本上,我用两个固定字符串包装命令,然后在开头和结尾搜索包含这些字符串的模式,并将内容保存在它们之间。例如:
set var "";
expect $prompt { send "echo PSTART; $command; echo PEND;\r"; }
expect {
-re PSTART\r\n(.*)PEND\r\n$prompt { set var [ string trim $expect_out(1,string) ]; send "\r"; }
-re $prompt { set var "" ; send "\r"; }
timeout { send_user "TIMEOUT\n"; exit }
}
我怀疑这种方法也适用于 shell 的注释字符,或者返回已知输出的简单状态命令。
然后你可以用'var'的内容做任何你需要的事情。