#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:
) ) {
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: