Как отправить пароль на команду, которую я запускаю с Perl Expect.pm? - PullRequest
1 голос
/ 21 октября 2010

У меня есть следующий скрипт,

#!/usr/bin/perl

use strict;
use warnings;
use Net::SSH::Perl;
use Expect;

my $logs = "logs";
open(LOG,'>>',"$logs") or die "can't logs $!\n";

my $domain = 'domain.com';
my @host = qw/host/;

foreach my $host (@host) {
   my $cmd = "passwd user1";
   my $sshost = join('.', $host, $domain);
   my $ssh = Net::SSH::Perl->new("$sshost");
   $ssh->login('root');
   $ssh->debug();
   my ($stdout, $stderr, $exit) = $ssh->cmd($cmd);
   print LOG $stdout,"\n";
}

Теперь моя проблема в том, что я не знаю, как использовать Expect для отправки пароля после выполнения $cmd и пора вводить пароль. $stdin не будет работать в этом случае, так как мы используем HPUX.

Цените любые указания и примеры, чтение документов Expect для меня ничего не даст.

Ответы [ 4 ]

3 голосов
/ 21 октября 2010

Я не думаю, что это возможно, к сожалению.Однако Net :: SSH :: Expect , кажется, может делать то, что вы хотите.

1 голос
/ 21 октября 2010

Подводя итог: вам нужен Expect, а модуль ssh бесполезен.

Я буду более точным: если я понимаю ваш исходный код, ваше требование, с точки зрения человека, будет примерно таким:Войдите в коллекцию хостов Unix и используйте passwd (1) для обновления пароля root на каждом.Имею ли я это право?

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

Хотя Net :: SSH - прекрасный и ценный модуль, он ничего не дает для решения того, что, как я понимаю, является вашимтребования.Вам нужен Expect.

Как оказалось, стандартный дистрибутив Expect на основе Tcl включает в себя пример, который соответствует вашей ситуации.Смотрите в http://www.ibm.com/developerworks/aix/library/au-expect/> описание passmass .

Идентичные функциональные возможности могут быть закодированы в Expect.pm , конечно.Однако, прежде чем я продемонстрирую это, я прошу этого люпина, задающего вопросы, подтвердить, что я нахожусь на пути к выполнению его истинных требований.

0 голосов
/ 29 мая 2013

Net :: OpenSSH можно комбинировать с Ожидайте , чтобы сделать это легко.

На самом деле в дистрибутив модуля входит пример сценария , которыйделает именно это!

0 голосов
/ 23 мая 2013

Я думаю, что у меня была похожая проблема при входе в привилегированный режим exec с маршрутизаторами cisco, который аналогичным образом запрашивает пароль при вызове «en».я обошел это с помощью специальной подпрограммы:

sub enable { my ($expect_session, $password) = @_;
  $expect_session->send("en\n");
  $expect_session->expect($timeout,
    [ qr/[Pp]assword:/,
    sub {
    my $expect_session = shift;
    $expect_session->send("$password","\n");
    exp_continue;
  } ],

    -re => $prompt,
 );
}

, но я думаю, что проблема в том, что вы не используете Perl's Expect, поскольку он предназначен для использования.Будет создан сеанс Expect для управления соединением SSH, затем через него будут отправляться команды.вам не нужен Net :: SSH: Perl вообще.вот мое определение $ hope_session:

  my $expect_session = new Expect();
  $expect_session->log_stdout(0);  # let's keep things quiet on screen; we only want command output.
  $expect_session->log_file(".expectlog");

  $expect_session->spawn("/usr/bin/ssh -o StrictHostKeyChecking=no $username\@$host")
   or die ("\nfor some reason we can't establish an SSH session to $host.\n
              it's something to do with the spawn process: $!\n");

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

...