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

时间:2014-04-01 10:52:24

标签: 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的新手,请帮我解决这个问题。

1 个答案:

答案 0 :(得分:2)

这与$?行为有关。

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

你可以:

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

  • 使用SSH模块,减少文本输出,如 Net::OpenSSH 。它是一个具有良好功能的模块,接近SSH协议并且主动维护。

    • 来自 Net::OpenSSH 文档:

        

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

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

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

    • 使用 $?

      Net::OpenSSH