perl系统命令执行

时间:2012-03-19 09:56:47

标签: perl ssh

在下面的代码中,我需要打印变量$stout$stderr的输出。我怎么能这样做,而不是没有使用$ssh = Net::SSH::Perl->new

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

3 个答案:

答案 0 :(得分: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 :(得分: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;

答案 2 :(得分: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对象只是闲逛并允许重用以收集多个文件,执行其他命令,并且通常重用连接,而不是每次都必须建立新的ssh连接