linux - 获取使用 Net::SSH::Expect 的 exec 执行的命令的退出状态

标签 linux perl ssh expect

我正在运行以下脚本:

#!/usr/local/bin/perl -w

use strict;
use warnings;
use Net::SSH::Expect;


my $ssh = Net::SSH::Expect->new(host=>"xxx.xxx.xxx.xxx",password=>"xxxxxxx", user=>"root" ,timeout=>3  );

$ssh->login();
$ssh->exec("stty -echo");

print "Connection Established\n";

my ($out) = $ssh->exec("rpm -ivh xxx");
print "\n\nOUTPUT: $out\n";


#$ssh->send("echo $?");
($out) = ($ssh->get_expect())->exitstatus();

print "\n\nEXIT STATUS: $out\n";

运行此命令,我无法获取所执行的“rpm -ivh ...”命令的退出状态。

我是 Perl 新手,请帮我解决这个问题。

最佳答案

这符合 $? 行为的预期。

Net::SSH::Expect 模块只不过是Expect处理远程命令执行的方式:你只能依赖命令输出,而不是底层赋予远程 shell 的退出代码值。

您可以:

  • 修改远程执行的命令以某种方式显示/返回与命令退出状态相关的一些字符串: 例如:rpm -ivh xxx && echo OK),

  • 使用较少面向文本输出的 SSH 模块,例如 Net::OpenSSH。这是一个功能不错的模块,接近 SSH 协议(protocol)并且得到积极维护。

    • 来自 Net::OpenSSH 文档:

      $ssh->system(\%opts, @cmd)

      在远程计算机上运行命令@cmd。成功则返回 true,否则返回 undef

      当远程命令以非零代码退出时,错误状态设置为 OSSH_SLAVE_CMD_FAILED(该代码可从 $? 获取,请参阅“$?"in perlvar).

    • 使用Net::OpenSSH:

      #!/usr/bin/env perl
      use strict;
      use warnings;
      use Net::OpenSSH;
      my $ssh = Net::OpenSSH->new( "xxx.xxx.xxx.xxx",
                                   user    => "root" ,
                                   passwd  => "xxxxxxx", 
                                   timeout => 3, 
                                 );
      
      if ($ssh) {
           print "Connection Established\n";
      
           my $out = $ssh->capture("rpm -ivh xxx");
           print "\n\nOUTPUT: $out\n";
           print "\n\nEXIT STATUS: $?\n";
      }
      

关于linux - 获取使用 Net::SSH::Expect 的 exec 执行的命令的退出状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22783727/

相关文章:

linux - 用于验证 Linux 上 docker 安装的 Shell 脚本

perl - 返回 boolean 值的 Perl 函数实际上返回什么

perl - 如何在 Perl 中找到文件的大小写保留名称?

regex - 如何在 Perl 中找到正则表达式匹配的位置?

php - 使用 PHP 运行 SSH 命令

linux - 使用 bash,如何删除特定目录中所有文件的扩展名?

database - Django 无法连接到 Opensuse 上的 Postgresql

linux - 如何在 bash shell 中读取带有部分的配置文件

linux - 并行来自特定远程文件夹的 scp 文件

mysql - Spring Boot SSH Mysql?