Как правильно дождаться подсказки в терминале перед отправкой команды с использованием ожидания для perl?

Я очень новичок как в 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(5);
$exp->send(command);

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


person MattieG4    schedule 14.04.2020    source источник
comment
что вы подразумеваете под ждет появления приглашения, но отправляет команду только один раз?   -  person pynexj    schedule 14.04.2020


Ответы (1)


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

person meuh    schedule 14.04.2020