在使用 perl 的 expect 发送命令之前,如何正确地等待终端中的提示?

How do you properly wait for the prompt in the terminal before sending a command using expect for perl?

我对 Perl 和 expect 都很陌生,一直在尝试弄清楚如何在仅出现提示时发送命令。我知道在终端显示某个输出后如何发送命令,但是当前一个命令没有特定的成功消息时找不到正确的命令发送方式,所以只有在行之后命令是提示符。我尝试使用的代码是:

$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(5);
$exp->send(command);

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

如果您只想在找到匹配项后 expect() 调用 return 并执行 send(),只需 return 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 模块,它为您处理每次查找提示的问题。