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

标签 perl ssh expect.pm

我在 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") 在远程机器上执行的?

最佳答案

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

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

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

关于perl - 获取通过 $self->send() 在 Perl Expect 模块中的远程主机上执行的命令的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26908683/

相关文章:

multithreading - 从 perl 线程生成 Expect

perl - 'use lib' 是否适用于 UNC 路径?

perl - 我如何在 Win32::Daemon 下运行 mojolicious?

ssh - Vagrant 文件。设置 ssh 代理的区域设置

powershell - SSH for git 在 Powershell 中不可用

perl - 通过 perl 的 expect 自动化和捕获登录提示

regex - perl 如何删除最后一个 '_' ?

Perl 将二进制流转换为十六进制

c - 读取 ssh 命令执行的标准输出