【问题标题】:Execute Perl script on remote server from local machine从本地机器在远程服务器上执行 Perl 脚本
【发布时间】:2013-08-16 17:10:47
【问题描述】:

我对 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");

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

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

【问题讨论】:

    标签: perl ssh


    【解决方案1】:

    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;
    

    【讨论】:

    • 在这种情况下,Perl 是在远程主机还是本地机器上寻找$crawler
    • @Tsamaunk 一切都是远程的,顺便说一句 -e $crawler 暗示命令行上的 perl 脚本
    【解决方案2】:

    如果您不向脚本传递参数,它应该像

    一样简单

    ssh "user@host" perl

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

    ssh "user@host" 'perl - arg1 arg2'

    【讨论】:

    • 这很好用,虽然我希望避免打电话给system()。这可能吗?
    • 如果你想完全避免 system(),看起来 CPAN 模块 Net::SSH::Perl 有一个纯 perl ssh 客户端可以做到这一点。如果您只想将系统调用包装在一个模块中,那么您可以继续使用 Net::SSH。您只需要像上面那样调用 perl,并将脚本的内容传递给它的标准输入。在 Net::SSH 中,看起来 sshopen2 可以在那里工作;您可以打开脚本并将其逐行写入 WRITER。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多