выполнение системной команды perl - PullRequest
0 голосов
/ 19 марта 2012

В следующем коде мне нужно распечатать выходные данные из переменных $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 ]

5 голосов
/ 19 марта 2012

Я использую 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 голос
/ 19 марта 2012

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 голосов
/ 19 марта 2012

Я всегда был поклонником IPC::Run:

use IPC::Run;

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

. На этом этапе результаты STDOUT и STDERR команды будут сохранены в этих двух лексических выражениях.

Хотя в качестве решения общей проблемы 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...