【问题标题】:Perl using find in qxPerl 在 qx 中使用 find
【发布时间】:2014-09-17 10:05:09
【问题描述】:

III 正在编写一个 Perl 脚本,该脚本需要通过 SSH 连接到多个远程服务器以执行一些日志文件的 gzip 压缩。在下一行中,我不断收到此错误,并且正在努力确定导致此错误的原因。我得到的错误是;

bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `cd /appdata/log/cdmbl/logs/; echo cd /appdata/log/cdmbl/logs/; find . -type f ( -iname '*' ! -iname '*.gz' ) -mmin +1440 ;; exit 0'

当然,你可以从错误中看出,我要写的那行是:

my $id = qx{ssh -q $cur_host "cd $log_path; echo cd $log_path; find . -type f \( -iname '*' ! -iname '*.gz' \) -mmin +1440 \;; exit 0"};

我是否在这里忽略了导致意外令牌“(”问题的问题 收到了吗?

注意:我从 find 中删除了 -exec,以便查看是否可以先解决此问题。

谢谢。

【问题讨论】:

  • 您可能会发现File::Find 很有用。 Perl 中的核心模块。也许Net::SSH
  • 很遗憾,这些是生产服务器,所以我没有能力添加模块。因此使用上述方法。
  • 这个东西的基本调试:改变你的 Perl 脚本来打印行而不是执行它。自己运行该行(ssh 命令)。它有效吗? SSH 进入远程服务器。运行要在其中运行的命令部分。它有效吗?如果这没有给您答案,请编辑您的问题以报告您所做的事情。
  • 好的...所以,只是为了清楚起见。 SSH 在我实现它的方式上运行良好。我不知道您是否认为我需要帮助。
  • 错误的命令引用。试试Net::OpenSSH(和Net::OpenSSH::Parallel),它们可以为你做报价。

标签: perl find syntax-error qx


【解决方案1】:

您需要对 shell 的括号进行反斜杠。在双引号中使用单个反斜杠是不够的,Perl 删除了反斜杠。使用双反斜杠\\(

【讨论】:

  • 所以,你的答案似乎解决了原来的错误。现在它产生以下内容。这是一个很好的方向。 find:路径必须在表达式之前用法:find [-H] [-L] [-P] [path...] [expression]
【解决方案2】:

这可能无法回答您的问题,但我想提出一个不错的选择。

你说你不能在生产服务器上安装额外的模块。您需要在其中查找文件并压缩它们的地方运行一堆东西。这一切都可以在 Perl 中完成,并且您可能比通过“从 Perl 脚本执行命令行操作”的方法拥有更多的控制权。

看看Object::Remote,它正是为此目的而编写的。它可以让你通过 ssh 进入机器并运行你在 local 机器上安装的 Perl 东西。这样,您无需在遥控器上添加模块或安装任何东西。它所需要的只是任何一种或多或少最近的 Perl,幸运的是几乎每个 Linux 都附带了它。

a very good lightning talk about it by the authorMatt Trout 非常值得一看。

【讨论】:

    【解决方案3】:

    如果你构建的命令导致语法错误,那么第一步不就是看看你构建了什么命令吗?

    print qq{ssh -q $cur_host "cd $log_path; echo cd $log_path; find . -type f \( -iname '*' ! -iname '*.gz' \) -mmin +1440 \;; exit 0"}, "\n";
    

    【讨论】:

    • 查看 choroba 的评论,因为这似乎已经修复了原始错误,现在我遇到了路径问题。
    • 我在 choroba 之后发布了我的答案。他告诉你解决方案;我给了你你应该用来找到解决方案的过程。 (“教人钓鱼……”)
    猜你喜欢
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多