我正在运行以下脚本:
#!/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/