获取使用 Net::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 Establishedn";
my ($out) = $ssh->exec("rpm -ivh xxx");
print "nnOUTPUT: $outn";

#$ssh->send("echo $?");
($out) = ($ssh->get_expect())->exitstatus();
print "nnEXIT STATUS: $outn";

运行这个,我无法获得"rpm -ivh ..."我执行的命令。

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

这是关于$?行为的预期。

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

您可以:

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

  • 使用 SSH 模块较少面向文本输出,如 Net::OpenSSH .它是一个具有良好功能的模块,接近SSH协议并积极维护。

    • Net::OpenSSH文档中:

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

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

      当远程命令以非零代码退出时,错误状态设置为OSSH_SLAVE_CMD_FAILED(代码可从$?获得,请参阅 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 Establishedn";
           my $out = $ssh->capture("rpm -ivh xxx");
           print "nnOUTPUT: $outn";
           print "nnEXIT STATUS: $?n";
      }
      

最新更新