我是Perl的新手,并且翻译了一些bash脚本,将来自多个远程生产服务器的Apache日志解析为更有用的格式,以便在本地计算机上进行处理。我需要尽可能保持生产服务器整洁。因此,我在本地计算机上有两个单独的.pl文件 - crawler.pl(以前称为crawler.sh),负责从生产服务器获取有用信息,以及reporter.pl(以前称为reporter.sh),负责运行搜寻器并整理从生产服务器检索的信息。
我想要完成的是Perl相当于:
ssh "user@host" 'bash -s' < $crawler
其中$ crawler是本地方框中crawler.sh的物理位置。
我希望reporter.pl在生产服务器上打开ssh连接并远程执行crawler.pl。,其效果如下:
use Net::SSH qw(ssh);
ssh($loginString,"perl -e $crawler");
这显然不起作用,但希望你明白我在开什么车。
我知道可以通过将爬虫文件复制到生产服务器并在完成任务时删除它来实现这一点;如果有的话,我会找到一个更优雅的解决方案。
答案 0 :(得分:5)
如果您没有将参数传递给脚本,那么它应该像
一样简单ssh“user @ host”perl&lt; $履带
如果你想传递命令行参数,只需使用“ - ”占位符来获得与bash -s相同的效果,即
ssh“user @ host”'perl - arg1 arg2'&lt; $履带
答案 1 :(得分:3)
Net::SSH
是ssh
可执行包装器,现在有更好的perl解决方案。
http://search.cpan.org/~remi/Net-SSH2-Simple/lib/Net/SSH2/Simple.pm#SYNOPSIS
my ($stdout,$stderr, $exitcode) = $ssh2->cmd("perl -e $crawler")
or die $ssh2->error;