Как правильно дождаться приглашения в терминале, прежде чем отправлять команду, используя ожидаемое значение perl? - PullRequest
3 голосов
/ 14 апреля 2020

Я очень плохо знаком с обоими Perl и ожидаю, и пытался выяснить, как отправить команду, когда появляется только приглашение. Я знаю, как отправить команду после отображения определенного вывода в терминале, но не могу найти правильный способ отправки команды, когда предыдущая команда не имеет определенного c сообщения об успехе, поэтому единственное строка после команды является подсказкой. Код, который я пытался использовать, был:

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

$ user. "@", $ Host представляет приглашение в терминале, но, как вы могли догадаться, Команда постоянно отправляется, как только команда отправляется, снова появляется приглашение, поэтому команда отправляется снова, поэтому программа застревает в бесконечном l oop. Я пытался изменить exp_continue на exit , но это означало, что вся подпрограмма перестала работать по какой-то причине. Я также пытался изменить exp_continue на exp_continue_timeout и добавить операторы сна в подпрограмму, но это не остановило бесконечное l oop.

I ' Мы также пытались использовать только

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

, но это просто отправляет команду в случайное время и не ждет, пока предыдущая команда завершится sh. Этот метод является единственно возможным или существует метод, который ожидает появления приглашения, но отправляет команду только один раз?

1 Ответ

2 голосов
/ 14 апреля 2020

Если вы просто хотите, чтобы звонок 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, который обрабатывает вас, ища подсказывать каждый раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...