【问题标题】:Get the output of a command executed via $self->send() on a remote host in Perl Expect module获取通过 $self->send() 在 Perl Expect 模块中的远程主机上执行的命令的输出
【发布时间】:2014-11-13 12:15:07
【问题描述】:

我在 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();

如何获得我在远程机器上通过$self->send("$COMMAND1\n") 执行的$COMMAND1 的结果?

【问题讨论】:

标签: perl ssh expect.pm


【解决方案1】:

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

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

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

【讨论】:

  • 感谢@DeVadder 的回复。早些时候,我以一种复杂的方式来做这件事。现在我做了一个直接的 ssh 并执行了命令,我能够实现我想要的任何东西。我的 $result = ssh crazy-user@RemoteServer "COMMAND1"。然后我解析 $result 来完成剩下的操作
  • @Joseph 嗯,是的,这可能是最好的方式,只要 COMMAND 只给你一些回报而不是交互的。
猜你喜欢
  • 1970-01-01
  • 2021-11-07
  • 2013-06-06
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 2015-11-20
相关资源
最近更新 更多