4

我在 Linux 服务器上编写了一个 Expect 脚本,该脚本应该远程登录到路由器以收集一些系统信息。到目前为止,我的脚本可以成功建立连接、运行路由器命令、断开连接并终止。

该命令显示了几行我需要解析的内容,我不确定如何在 Expect 中执行。如何保存输出,grep 一行,然后从行中提取一列,最后将结果保存在文件中?如果可能的话,我想完全使用 Expect 而不是变通方法(例如 Expect 嵌入在 Bash 中)。

谢谢你的时间。jk04

4

3 回答 3

7

期望开发的两个技巧:

  • autoexpect为您的自动化设计一个框架
  • exp_internal 1详细地显示期望在内部做什么。当您无法弄清楚为什么您的正则表达式没有捕获您的期望时,这个是必不可少的。
于 2010-01-16T21:02:38.330 回答
6

基本上,$expect_out(buffer) [1]。将最后一个期望匹配的输出保存到当前匹配。你可以在那里找到你的命令输出。

对于字符串操作,您可以简单地使用 tcl 的内置 [2][3]。

  1. “如何在 Expect 中访问远程命令的结果” http://wiki.tcl.tk/2958
  2. “正则表达式” http://wiki.tcl.tk/986
  3. “字符串匹配” http://wiki.tcl.tk/4385
于 2010-01-16T16:15:11.853 回答
4

我遇到并解决了与 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'的内容做任何你需要的事情。

于 2011-05-02T19:08:02.990 回答