4

我对 Perl 比较陌生,我需要翻译一些 bash 脚本来将来自多个远程生产服务器的 Apache 日志解析为更有用的格式,以便在本地机器上进行处理。我需要保持生产服务器尽可能整洁。因此,我的本地机器上有两个单独的 .pl 文件 - crawler.pl(以前称为 crawler.sh),负责从生产服务器中获取有用信息,以及 report.pl(以前称为 report.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");

这显然是行不通的,但希望你明白我在说什么。

我知道可以通过将爬虫文件复制到生产服务器并在完成任务后将其删除来完成此操作;如果存在的话,我正在寻求更优雅的解决方案。

4

2 回答 2

4

如果您没有将参数传递给脚本,它应该很简单

ssh "user@host" perl < $crawler

如果要传递命令行参数,只需使用“-”占位符即可获得与 bash -s 相同的效果,即

ssh "user@host" 'perl - arg1 arg2' < $crawler

于 2013-08-14T16:35:23.057 回答
3

Net::SSHssh可执行包装器,现在有更好的 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;
于 2013-08-14T16:44:03.447 回答