Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl脚本-将STDOUT从管道ssh shell打印到文件中_Perl_Shell_Ssh_Pipe_Stdout - Fatal编程技术网

Perl脚本-将STDOUT从管道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\

我所处的环境无法加载外部软件。我们没有Net::SSH,我无法加载它。我使用ssh键和管道ssh实现了自己的功能。我现在可以在远程服务器上运行任何命令,而无需手动登录并键入命令,但我正在尝试在自己的服务器上捕获输出。由于管道shell,我无法将屏幕输出捕获到文件中

下面是非常粗略的通用代码:

#!/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
中讨论所有这些内容的位置。