2016-09-15 7 views
1

ソフトウェアの外部に読み込めない環境です。私たちはNet :: SSHを持っておらず、ロードできません。私はsshキーと配管sshを使って自分自身を巻いた。手動でログインして入力することなくリモートサーバー上の任意のコマンドを実行できますが、自分のサーバーで出力をキャプチャしようとしています。私は、パイプ出力されたシェルのためにスクリーン出力をファイルに取り込むのに問題があります。Perlスクリプト - パイプされたsshシェルからのSTDOUTをファイルに出力します。

ここでは非常にラフな汎用コードです:この場合

#!/usr/bin/perl -w 
## 
  
my ($ip)        = @ARGV; 
my $rpm_logfile = "rpms"; 
  
print "The IP file is $ip\n"; 
  
open(my $IN, "<", $ip) || die "Could not find filename $ip $!"; 
open(my $OUT, ">>", $rpm_logfile) || die "Could not open file $rpm_logfile $!"; 
  
while (<$IN>) { 
  chomp; 
  my $my_ip = $_; 
  
  if (not defined $my_ip) { 
    die "Need an IP after the command.\n"; 
  } 
  # ssh key was set up, so no password needed 
  open my $pipe, "|-", "ssh", "$my_ip", or die "can't open pipe: $!"; 
  
  # print the machine IP in the logfile 
  # and pretty print the output. 
  print $OUT "$my_ip \n***************\n"; 
  
  # run the command on the other box via the ssh pipe 
  print {$pipe} "rpm -qa"; 
  
}; #end while INFILE 
  
close $IN; 
close $OUT; 

@ARGVは、その中のIPアドレスを持つテキストファイルを1行に1つずつです。

rpm -qaを画面に出力するように機能しますが、その出力を$ OUTファイルハンドルに取り込むことができません。私はこのコーナーの周りを考えていないだけで、私は本当にそれを得ることに近いと知っています。

+1

、あなた 'open'-EDそれTO_ _writeするためのプロセス、その' STDIN'が今 '$のpipe'に装着されているので、あなたが書いたものです。だからあなたは 'STDOUT'を得ることができません。代わりに、正確なbash解法と同じように、 'qx(ssh $ pi ...)'(バッククォート)を実行して、出力を返します。 – zdim

+0

ええ、それは正しいです。 openは片方向のプロセスです。書き込みまたは読み取りのどちらか一方であり、両方ではありません。私が回転で試したことの1つはqq(ssh $ ip ...)ですが、qqは二重引用符でバッククォートではありません。私が手紙を変えたら、私はそれを持っていただろう。または、コマンドの前後にバッククイックを置くだけです。 – ScotT

+0

正しい。ただし、プロセスを実行する(または「開く」)方法はいくつもあります。プロセスを使用すると、すべてのプロセスを取得できます。それについての多くのSOの投稿があります。この場合、シンプルなバッククォート['qx'](http://perldoc.perl.org/functions/qx.html)がそれをするので、あなたはそれを必要としません。このドキュメントのページにあるリンクをたどって 'perlop'の場所に移動してください。 – zdim

答えて

3

本当にこのすべてのperlが必要ですか?基本的なfor-loopはどうでしょうか?あなたのローカルマシンでコマンド "ssh $ip rpm -qa"を実行すると、出力は標準出力に送られ、好きなように何でもできます。

1行に
$ for ip in `cat iplist.txt` 
> do 
> echo -e "${ip}\n----------------" 
> ssh $ip rpm -qa 
> echo "++++++++++++++++" 
> done 

または全て:Perl用として

(for ip in `cat iplist.txt`; do echo -e "${ip}\n----------------" ; ssh $ip rpm -qa ; echo "++++++++++++++++"; done) > rpms 
+0

時には、夜遅く、私たちはこれらの「ああ、君」の瞬間を持っています。これはその一つです。それは動作します。私はここからそれを実行します。ありがとう! – ScotT

+0

喜んで助けてください、そして、私はそれらの瞬間を自分でたくさん持っていました。私はtryと1つの質問stackoverflowが私の独身の瞬間と私を助けているときに答えて、今日はいくつかありました;-) –

関連する問題