Perl ожидает вывода выполненной команды - PullRequest
2 голосов
/ 24 октября 2011

я написал небольшой скрипт, который выполняет команду 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 => '$' ) ) {
            return "Never connected " . $ssh->exp_error() . "\n";
    }
    sleep 1;
    $ssh->send_slow(0, "ls -l\r");
    $ssh->clear_accum();
    my $str = $ssh->exp_after();
    print "STR = '$str'\n";

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

Ответы [ 6 ]

2 голосов
/ 26 октября 2011
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$output\n\n";
1 голос
/ 05 сентября 2012

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

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

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

0 голосов
/ 08 июня 2012

Условия обывателя?

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

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

0 голосов
/ 25 октября 2011

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

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

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

0 голосов
/ 24 октября 2011

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

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

0 голосов
/ 24 октября 2011

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

...