在Perl Expect模块中的远程主机上获取通过$ self-> send()执行的命令输出

时间:2014-11-13 12:15:07

标签: perl ssh expect

我在Perl中使用Expect模块进行交互式活动并在远程计算机上执行命令。请求您的帮助

以下是我使用的步骤

切换用户到另一个帐户。 发送密码登录。 获得新用户的shell后,执行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")的结果?

1 个答案:

答案 0 :(得分:1)

我绝不是这方面的专家,但到目前为止还没有人回答,让我尝试一下。

您的expect命令是su,因此,正常的期望只会对该命令回答原始shell的任何内容起作用。然而,这只是密码提示,也许是一些错误消息。您仍然可以发送命令,但是它们的响应显示在新用户的shell上,而不是执行了expect命令的shell。这就是为什么它们出现在屏幕上但不出现在您的expect对象可用的流中。请注意,如果你直接在哪里ssh,你可能会遇到同样的问题(我不知道为什么你会su然后再ssh,你不能直接ssh crazy-user@remote_machine吗?)。

解决方案可能是将sussh直接删除到使用Net::SSH::Expect而不是普通Expect的远程计算机上所需的用户,因为它会为您提供所有写入的内容远程控制台在其输出流中。但要小心,如果我没记错的话,检查流的语法略有不同。

相关问题