Perl ожидает вывода выполняемой команды

#perl #expect

#perl #ожидать

Вопрос:

я написал небольшой скрипт, который выполняет команду ls. Теперь я хочу сохранить выходные данные этой команды в переменной, чтобы работать с ней в дальнейшем perl-скрипте. К сожалению, я не могу получить вывод из команды ls.

 my ($core) = "servername";
    my $tel_con = "ssh ".$core. " -l $user";

    $ssh = Expect->spawn("$tel_con");
    $ssh->log_stdout(1);

    unless ( $ssh->expect( 5, -re => '

Может быть, вы могли бы мне чем-нибудь помочь, пожалуйста?


Ответ №1:

 use Net::OpenSSH;

my $ssh = Net::OpenSSH->new($core, user => $user);
$ssh->error and die $ssh->error;

my $output = $ssh->capture('ls -l');

print "command output:n$outputnn";
 

Ответ №2:

В случае, если вы не можете или не хотите использовать Net::OpenSSH, вы можете сделать:

 my @output = $exp->expect(5);
print 'OUT: '.$output[3].'END';
 

Чтобы получить весь вывод (включая используемую команду, возвращаемую строку, информацию о консоли)

Ответ №3:

вы можете вызвать expect в отдельном процессе и получить выходные данные через qx или открыть канал

Комментарии:

1. Может быть, вы можете привести мне короткий пример?

2. Пример: скопируйте ожидаемый код в дополнительный файл ssh.pl и сделайте мой $ls_content = qx(ssh.pl $аргументы);

3. Извините, но я действительно новичок в ожиданиях. Поэтому я вызываю верхний опубликованный скрипт с ls_content = qx(ssh.pl ) ?

Ответ №4:

Что такое send_slow? В зависимости от того, как эта команда отправляет команду ls, вывод может быть получен различными способами.

Скорее всего, вывод ошибки команды хранится в переменной $?, возможно, со сдвигом в байтах.

Ответ №5:

Кажется, что Expect перенаправит все STDOUT и зарегистрирует его внутри. Поскольку вы включили вывод с $ssh->log_stdout(1) помощью , вы должны иметь возможность получать результаты ls -l непосредственно из STDOUT (возможно, перенаправляя стандартный вывод в переменную). Вы также можете увидеть, как можно получить данные из внутреннего ведения журнала. Просто не забудьте захватить выходные данные, прежде чем делать clear_accum() .

Из CPAN: $object->send_slow($delay, @strings);

... После каждого символа $object будет проверяться, чтобы определить, есть ли у него какие-либо новые данные, и если да, обновите накопитель для будущих вызовов expect() и распечатайте выходные данные в STDOUT и @listen_group, если log_stdout и log_group установлены соответствующим образом.

Комментарии:

1. Спасибо. Не могли бы вы дать мне небольшой пример кода, пожалуйста? Я попробовал следующее: $ telnet = Expect-> spawn("$ tel_con"); $telnet-> debug(3); $ telnet-> exp_internal(1); $telnet-> log_stdout(0); $ telnet-> set_group($ ret); $ telnet->log_group(1); $ telnet-> ожидать (0); если ( $telnet-> ожидать (5, -re => '$' ) ) { возвращает "Никогда не подключался" . $telnet-> exp_error() . "n"; } sleep 1; $telnet-> send_slow(0, "ls -l r"); мой $ str = $telnet-> before(); вывести "STR = '$str' n"; распечатать "ret = $ret n";

Ответ №6:

Условия непрофессионала?

Я должен обязательно опубликовать эту ссылку - я все еще захожу туда время от времени, это самое непрофессиональное объяснение, которое я когда-либо находил из всех вещей regex:

http://www.anaesthetist.com/mnm/perl/Findex.htm

) ) {
return "Never connected " . $ssh->exp_error() . "n";
}
sleep 1;
$ssh->send_slow(0, "ls -lr");
$ssh->clear_accum();
my $str = $ssh->exp_after();
print "STR = '$str'n";
Может быть, вы могли бы мне чем-нибудь помочь, пожалуйста?

Ответ №1:


Ответ №2:

В случае, если вы не можете или не хотите использовать Net::OpenSSH, вы можете сделать:


Чтобы получить весь вывод (включая используемую команду, возвращаемую строку, информацию о консоли)

Ответ №3:

вы можете вызвать expect в отдельном процессе и получить выходные данные через qx или открыть канал

Комментарии:

1. Может быть, вы можете привести мне короткий пример?

2. Пример: скопируйте ожидаемый код в дополнительный файл ssh.pl и сделайте мой $ls_content = qx(ssh.pl $аргументы);

3. Извините, но я действительно новичок в ожиданиях. Поэтому я вызываю верхний опубликованный скрипт с ls_content = qx(ssh.pl ) ?

Ответ №4:

Что такое send_slow? В зависимости от того, как эта команда отправляет команду ls, вывод может быть получен различными способами.

Скорее всего, вывод ошибки команды хранится в переменной $?, возможно, со сдвигом в байтах.

Ответ №5:

Кажется, что Expect перенаправит все STDOUT и зарегистрирует его внутри. Поскольку вы включили вывод с $ssh->log_stdout(1) помощью , вы должны иметь возможность получать результаты ls -l непосредственно из STDOUT (возможно, перенаправляя стандартный вывод в переменную). Вы также можете увидеть, как можно получить данные из внутреннего ведения журнала. Просто не забудьте захватить выходные данные, прежде чем делать clear_accum() .

Из CPAN: $object->send_slow($delay, @strings);

… После каждого символа $object будет проверяться, чтобы определить, есть ли у него какие-либо новые данные, и если да, обновите накопитель для будущих вызовов expect() и распечатайте выходные данные в STDOUT и @listen_group, если log_stdout и log_group установлены соответствующим образом.

Комментарии:

1. Спасибо. Не могли бы вы дать мне небольшой пример кода, пожалуйста? Я попробовал следующее: $ telnet = Expect-> spawn(«$ tel_con»); $telnet-> debug(3); $ telnet-> exp_internal(1); $telnet-> log_stdout(0); $ telnet-> set_group($ ret); $ telnet->log_group(1); $ telnet-> ожидать (0); если ( $telnet-> ожидать (5, -re => ‘$’ ) ) { возвращает «Никогда не подключался» . $telnet-> exp_error() . «n»; } sleep 1; $telnet-> send_slow(0, «ls -l r»); мой $ str = $telnet-> before(); вывести «STR = ‘$str’ n»; распечатать «ret = $ret n»;

Ответ №6:

Условия непрофессионала?

Я должен обязательно опубликовать эту ссылку — я все еще захожу туда время от времени, это самое непрофессиональное объяснение, которое я когда-либо находил из всех вещей regex:

http://www.anaesthetist.com/mnm/perl/Findex.htm