使用perl中的expect远程执行变量中的命令输出

时间:2012-02-20 09:14:02

标签: perl

我有一个密码变量$pw和一个命令变量$cmd

$pw=UNIX password of a remote machine.

$cmd=Command to be executed in the remote machine.

现在如果我使用back-tick运行命令 我将能够在输出变量中获得一些值。

现在如果我想通过期望运行相同的命令我如何实现相同。我的意思是如何通过变量中的期望来运行命令的输出。

我的期望功能如下:

  sub expt($$){
my $cmd;
my $timeout;
    ($cmd, $pw)=@_;
$expect = Expect->new;
$expect->raw_pty(1);
printDebug("Running the command under expt");
$expect->spawn($cmd)
    or die "Cannot spawn $cmd: $!\n";
$expect->expect($timeout,
            [   qr/password:/i, #/
                sub {
                    my $self = shift;
                    $self->send("$pw\n");
                    exp_continue;
                }
            ],
            [qr/Are you sure you want to continue connecting \(yes\/no\)?/
                , sub { my $self = shift;
                                   $self->send("yes\n");
                                   exp_continue; }],
             [qr/Unix password \(user\):/
               , sub { my $self = shift;
                                   $self->send("pw\n");
                                   exp_continue; } 
             ],                      
                  );

$expect->soft_close();
   return 0;             
 }

我正在调用像

这样的函数
expt($cmd,$pw);

通过这样做,我能够在远程主机中执行脚本,但我的要求是将远程主机的输出存储在本地变量中。

1 个答案:

答案 0 :(得分:1)

为什么不使用Net::SSH::Expect?它会更接近第一种方法:你“只是”需要做类似的事情:

my $ssh = Net::SSH::Expect->new (
        host => "myserver.com", 
        user => 'myuser', 
        raw_pty => 1
    );
$ssh->run_ssh() or die "SSH process couldn't start: $!";
($ssh->read_all(2) =~ />\s*\z/) or die "where's the remote prompt?"
$ssh->exec("stty raw -echo");
my $output = $ssh->exec($cmd);

查看Net::SSH::Expect pod文档,它非常广泛。