Perl脚本-将STDOUT从管道ssh shell打印到文件中
我所处的环境无法加载外部软件。我们没有Net::SSH,我无法加载它。我使用ssh键和管道ssh实现了自己的功能。我现在可以在远程服务器上运行任何命令,而无需手动登录并键入命令,但我正在尝试在自己的服务器上捕获输出。由于管道shell,我无法将屏幕输出捕获到文件中 下面是非常粗略的通用代码:Perl脚本-将STDOUT从管道ssh shell打印到文件中,perl,shell,ssh,pipe,stdout,Perl,Shell,Ssh,Pipe,Stdout,我所处的环境无法加载外部软件。我们没有Net::SSH,我无法加载它。我使用ssh键和管道ssh实现了自己的功能。我现在可以在远程服务器上运行任何命令,而无需手动登录并键入命令,但我正在尝试在自己的服务器上捕获输出。由于管道shell,我无法将屏幕输出捕获到文件中 下面是非常粗略的通用代码: #!/usr/bin/perl -w ## my ($ip) = @ARGV; my $rpm_logfile = "rpms"; print "The IP file is $ip\
#!/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;
#/usr/bin/perl-w
##
my($ip)=@ARGV;
我的$rpm\u logfile=“rpm”;
打印“IP文件为$IP\n”;
打开(我的$IN,“>”,$rpm_日志文件)| | die“无法打开文件$rpm_日志文件$!”;
而(){
咀嚼;
my$my_ip=$;
如果(未定义$my_ip){
die“命令后需要IP。\n”;
}
#ssh密钥已设置,因此不需要密码
打开我的$pipe,“|-”、“ssh”、“$my_ip”,或者死在“无法打开管道:$!”;
#在日志文件中打印机器IP
#然后漂亮地打印输出。
打印$OUT“$my_ip\n******************\n”;
#通过ssh管道在另一个框上运行命令
打印{$pipe}“rpm-qa”;
}; #填充时结束
以美元收盘;
收尾美元;
@在本例中,ARGV是一个包含IP地址的文本文件,每行一个
它可以将rpm-qa输出到屏幕上,但我无法将输出捕获到$OUT文件句柄中。我只是没有在这个拐角处思考,我知道我真的很快就要得到它了 您确定需要所有的perl来完成此任务吗?一个基本的for循环怎么样?如果在本地计算机上运行命令“
ssh$iprpm-qa
”,输出将转到stdout,您可以使用它执行任何操作
$ for ip in `cat iplist.txt`
> do
> echo -e "${ip}\n----------------"
> ssh $ip rpm -qa
> echo "++++++++++++++++"
> done
或全部在一行上:
(for ip in `cat iplist.txt`; do echo -e "${ip}\n----------------" ; ssh $ip rpm -qa ; echo "++++++++++++++++"; done) > rpms
有时候,在深夜,我们会有这样的“哦,对”时刻。这是其中之一。这很有效。我会从这里带着它跑。谢谢很高兴能帮上忙,我自己也经历过很多这样的时刻。当stackoverflow帮助我度过了我自己的无聊时光时,我喜欢尝试回答一个问题,今天有好几个;-)对于Perl,您可以
打开
-ed进程来写入它,因此它的STDIN
现在被附加到您要写入的$pipe
。因此,您无法获取其标准输出。相反,您可以执行与fine bash解决方案中完全相同的操作——运行qx(ssh$pi…
(backticks)),返回输出。是的,这是正确的。open是一个单向进程——要么写,要么读,但不能两者兼而有之。我在旋转中尝试的一件事是qq(ssh$ip…),但qq是双引号而不是反勾号。如果我刚换了一封信,我早就收到了。或者只是在命令周围加上反勾号。正确。但是请注意,运行(或打开
-ing)流程有很多方法,可以让您捕获流程的所有信息。有很多这样的帖子。只是在这种情况下,你不需要它,因为简单的倒勾就可以了。按照此文档页面上的链接,找到perlop
中讨论所有这些内容的位置。