首页 > 解决方案 > 在使用 perl 的 expect 发送命令之前,如何正确等待终端中的提示?

问题描述

我对 Perl 和期望都很陌生,并且一直试图弄清楚如何在仅出现提示时发送命令。我知道在终端中显示某个输出后如何发送命令,但是当上一个命令没有特定的成功消息时找不到发送命令的正确方法,所以后面的唯一内容命令是提示符。我尝试使用的代码是:

$exp->expect($timeout,  
      [$user."@".$host, sub{my $self = shift;
                               $self -> send(the command I want to send);
                               exp_continue;}],
      $GW);

$user. " @",$host代表终端中的提示符,但正如您可能猜到的那样,命令会不断发送,因为一旦发送命令,提示符就会再次出现,因此再次发送命令,所以程序陷入无限循环。我尝试将exp_continue更改为exit,但这意味着整个子程序由于某种原因停止工作。我还尝试将exp_continue更改为exp_continue_timeout并在子例程中添加 sleep 语句,但它并没有停止无限循环。

我也尝试过使用

sleep(5);
$exp->send(command);

但这只是在看似随机的时间发送命令,而不是等待前一个命令完成。这种方法是唯一可能的方法,还是有一种方法可以等待提示出现但只发送一次命令?

标签: linuxperlexpect.pm

解决方案


如果您只想在expect()找到匹配项之后调用返回并且您这样做了send(),只需返回undef而不是exp_continue.

通常,expect()当您有很多不同的提示要做出反应时,您会以自己的方式使用。如果您只是要逐行发送命令并且在每行之间有相同的提示,您可以交替它们:

my $prompt = $user."@".$host;
$rc = $exp->expect($timeout, $prompt);
$exp->send("date\n");
$rc = $exp->expect($timeout, $prompt);
$exp->send("ls\n");

或者另见 Expect::Simple 模块,它每次都为您处理寻找提示。


推荐阅读