如何捕获使用Expect发送的命令的结果

时间:2016-06-07 05:30:02

标签: perl expect.pm

使用Perl Expect模块时,我必须捕获send命令的输出。

我知道在shell或Tcl中我可以使用puts $expect_out(buffer);来捕获先前运行的命令。

我怎样才能在Perl中做同样的事情?

我在远程机器上发送以下命令:

$expect->send("stats\n");

我需要在某个变量中捕获stats输出。

1 个答案:

答案 0 :(得分:1)

首先,您必须知道在输出所请求数据后CLI的最后一行是什么样子。 Expect可以在您定义的超时内搜索某个模式。如果发现了......您可以使用$expect->send($command)命令捕获$exp-before()以来的所有内容。或者,如果您希望在命令后捕获所有内容,只需使用$expect->after()而不检查特殊符号。

让我举个例子:

$expect->send("$command\n");
#mask the pipe-symbol for later use. Expect expects a valid regex
$command =~ s/\|/\\\|/;
#if a huge amount of data is requested you have to avoid the timeout
$expect->restart_timeout_upon_receive(1);
if(!$expect->expect($timeout, [$command])){ #timeout
   die: "Timeout at $command";
}else{
   #command found, no timeout
   $expect->after();
   $expect->restart_timeout_upon_receive(1);
   if(!expect->expect($timeout,["#"])){
     die "Timeout at $command";
   } else{
      $data = $expect->before(); #fetch everything before the last expect() call
   }
}
   return $data;

所以你必须解雇你的命令,然后期望你的命令被解雇了。在此之后,您可以获取所有内容,直到您的命令提示符,在我的情况下,它由#指示。命令与最后一个$expect->expect($timeout,["#"]之间的行将作为单个字符串存储在$ data中。之后,您可以处理此字符串。

我希望我能再帮助你一点。 ;)