2

我在 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")

4

1 回答 1

1

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

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

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

于 2014-11-13T18:10:00.800 回答