ソフトウェアの外部に読み込めない環境です。私たちは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ファイルハンドルに取り込むことができません。私はこのコーナーの周りを考えていないだけで、私は本当にそれを得ることに近いと知っています。
、あなた 'open'-EDそれTO_ _writeするためのプロセス、その' STDIN'が今 '$のpipe'に装着されているので、あなたが書いたものです。だからあなたは 'STDOUT'を得ることができません。代わりに、正確なbash解法と同じように、 'qx(ssh $ pi ...)'(バッククォート)を実行して、出力を返します。 – zdim
ええ、それは正しいです。 openは片方向のプロセスです。書き込みまたは読み取りのどちらか一方であり、両方ではありません。私が回転で試したことの1つはqq(ssh $ ip ...)ですが、qqは二重引用符でバッククォートではありません。私が手紙を変えたら、私はそれを持っていただろう。または、コマンドの前後にバッククイックを置くだけです。 – ScotT
正しい。ただし、プロセスを実行する(または「開く」)方法はいくつもあります。プロセスを使用すると、すべてのプロセスを取得できます。それについての多くのSOの投稿があります。この場合、シンプルなバッククォート['qx'](http://perldoc.perl.org/functions/qx.html)がそれをするので、あなたはそれを必要としません。このドキュメントのページにあるリンクをたどって 'perlop'の場所に移動してください。 – zdim