2014-04-01 53 views
2

我運行下面的腳本:獲得退出狀態::期待

#!/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"; 

運行這個,我沒能拿到「轉的退出狀態-ivh ...「命令,我執行。

我是Perl新手,請幫我解決這個問題。

+0

爲什麼括號左右($出來)?文檔沒有這些。 (https://metacpan.org/release/Net-SSH-Expect) 另外,如果您有「使用警告」,則可以在第一行中刪除-w標誌。 – davewood

+0

@davewood。當然,你應該嘗試'$ out = $ ssh-> exec(「rpm -ivh xxx」);'...但是這並不能解決你對'$?'的渴望,也不能解決遠程提示和/或prompt_command。 – Ouki

回答

2

這與預期有關的$?行爲。

Net::SSH::Expect模塊無非是期望處理遠程命令執行的方式:只能依靠命令輸出,而不能給出給遠程shell的底層退出代碼值。

您可以:

  • 修改遠程執行命令以某種方式顯示/返回相關命令的退出狀態的一些字符串: 例如:rpm -ivh xxx && echo OK),

  • 使用SSH模塊少文本輸出導向,如Net::OpenSSH。它是一個具有很好功能的模塊,接近SSH協議並得到積極維護。

    • Net::OpenSSH文檔:

      $ SSH->系統(\%選擇採用,@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 Established\n"; 
      
          my $out = $ssh->capture("rpm -ivh xxx"); 
          print "\n\nOUTPUT: $out\n"; 
          print "\n\nEXIT STATUS: $?\n"; 
      }