Получить вывод команды, выполненной через $self-›send() на удаленном хосте в модуле Perl Expect.

Я использую модуль Expect в Perl для выполнения интерактивного действия и выполнения команды на удаленной машине. Прошу вашей помощи в этом

Вот шаги, которые я использовал

Сделайте переключение пользователя на другую учетную запись. Отправляет пароль для входа. Как только я получу оболочку для нового пользователя, выполните команду ssh для подключения к удаленной машине.

Затем я хочу выполнить команду на этой удаленной машине и получить ее ответ. Я могу выполнить команду на удаленной машине. Я тоже вижу результат на своем терминале. Но я не могу зафиксировать его в переменной, чтобы сравнить его со значением.

use Expect;   
my $exp = Expect->new;
$exp->raw_pty(1);

$exp->spawn('su - crazy_user') or die "Cannot spawn switch user cmd: $!\n"
$exp->expect($timeout,
  [ qr/Password:/i,
            sub {   my $self = shift;
                    $self->send("$passwd\n");
                    exp_continue;
     }],

  [ qr/\-bash\-4.1\$/i,
            sub {   my $self = shift;
                    $self->send("ssh $REMOTE_MACHINE\n");
        $self->send("$COMMAND1\n");
        exp_continue;
  }]
 );
 $exp->soft_close();

Как я могу получить результат $COMMAND1, который я выполнил на удаленной машине через $self->send("$COMMAND1\n")?


person Joseph    schedule 13.11.2014    source источник
comment
используйте Net::OpenSSH!   -  person salva    schedule 17.11.2014


Ответы (1)


Я ни в коем случае не эксперт в этом, но поскольку никто еще не ответил, позвольте мне попробовать.

Ваша ожидаемая команда — это su, и поэтому обычное ожидание будет работать только с любым ответом этой команды на вашу исходную оболочку. Однако это только запрос пароля и, возможно, некоторые сообщения об ошибках. Вы по-прежнему можете отправлять команды, но их ответы отображаются в оболочке нового пользователя, а не в оболочке, в которой была выполнена ожидаемая команда. Вот почему они отображаются на экране, но не в потоке, доступном для вашего ожидаемого объекта. Обратите внимание, что вы, вероятно, столкнетесь с той же самой проблемой, если будете использовать ssh напрямую (в любом случае, я не уверен, зачем вам su, а затем ssh, не могли бы вы напрямую ssh crazy-user@remote_machine?).

Решение, вероятно, состоит в том, чтобы избавиться от su и ssh непосредственно в нужном вам пользователе на удаленной машине, используя Net::SSH::Expect вместо простого Expect, поскольку он дает вам все, что написано на удаленной консоли в своем выходном потоке. Но будьте осторожны, если я правильно помню, синтаксис проверки потока немного отличается.

person DeVadder    schedule 13.11.2014
comment
Спасибо @DeVadder за ответ. Раньше я делал это сложным способом. Теперь я сделал прямой ssh ​​и выполнил команду, и я могу добиться всего, чего хотел. мой $result = ssh Crazy-User@RemoteServer COMMAND1. Затем я проанализировал $result, чтобы выполнить остальную часть операции. - person Joseph; 18.11.2014
comment
@Joseph Ну, да, это, вероятно, лучший способ, пока COMMAND дает вам что-то взамен и не является интерактивным. - person DeVadder; 18.11.2014