2012-03-19 216 views
0

在下面的代碼中,我需要打印來自變量$stout,$stderr的輸出。我怎樣才能做到這一點,而不是沒有使用$ssh = Net::SSH::Perl->newperl系統命令執行

#!/usr/bin/perl 
use strict; 
use warnings; 
use Net::SSH::Perl; 
use FindBin qw($RealBin); 
use File::Basename; 
use lib "/nfs/site/proj/dpg/tools/lib/perl"; 
use Util; 
use Getopt::Std; 
use Net::SSH::Perl; 
use Cwd; 
use File::Copy; 

my $host = 'someip.com.com'; 
my $pass = ''; 
my $user = ''; 
my $cmd = 'pwd'; 

my($stdout,$stderr,$exit) = system('ssh someip.com cat /nfs/site/home/aa/test11.txt')  ; 
if ($stdout) { 
    print "Standard output is \n$stdout"; 
} elsif($stderr) { 
    print "Standard error is \n$stderr"; 
} 
+0

根據perldoc,系統返回退出代碼,所以你的命令系統('ssh ...')可能會把退出代碼設置爲$ stdout並且讓$ stderr和$ exit定義爲undefined。變量? – 2012-03-19 10:01:54

+0

$ stdout我期待的文件的內容,如果文件doest存在,我期待stderr中的錯誤信息 – Rajeev 2012-03-19 10:04:33

+0

如果你反向運行而不是系統,它會返回輸出,但我不是確定如何區分成功的輸出(文件)和不成功的輸出(錯誤信息)。$ output = \'ssh someip.com ... \' – 2012-03-19 10:11:09

回答

5

我用IO::CaptureOutput,其簡單。

use strict; 
use warnings; 

use IO::CaptureOutput qw(capture_exec); 

my $cmd = "ssh someip.com cat /nfs/site/home/aa/test11.txt"; 
my ($stdout, $stderr, $success, $exitcode) = capture_exec($cmd); 

您還可以使用我認爲更安全的capture_exec中的列表參數。

1

open3可以讀取/寫入所有句柄:

use FileHandle; 
use IPC::Open3; 
my $cmd = "ssh someip.com cat /nfs/site/home/aa/test11.txt"; 
open3(\*GPW, \*GPR, \*GPE, "$cmd") or die "$cmd"; 
    # print GPW "write to ssh"; 
close GPW; 
while (<GPR>) { 
    # read stdout 
} 
while (<GPE>) { 
    # read stderr 
} 
close GPR; close GPE; 
0

我一直的IPC::Run風扇:

use IPC::Run; 

my $exitcode = run [ "ssh", "someip.com", "cat", ... ], 
    undef, \my $stdout, \my $stderr; 

此時該命令的STDOUTSTDERR結果將被存儲在這兩個詞法。

雖然作爲解決的ssh「荷蘭國際集團到主機和檢索從Perl程序中的文件的內容的一般性問題,你可能會喜歡IPC::PerlSSH

use IPC::PerlSSH; 

my $ips = IPC::PerlSSH->new(Host => "someip.com"); 
$ips->use_library("FS", qw(readfile)); 

my $content = $ips->call("readfile", "/nfs/site/home/aa/test11.txt"); 

這裏的$ips對象將只四處閒逛並允許重複使用以收集多個文件,執行其他命令,並且通常重新使用連接,而不必每次都建立新的連接。