2

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,这样我可以看看我是否可以先解决这个问题。

谢谢。

4

3 回答 3

2

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

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

看看Object::Remote,它正是为此目的而编写的。它允许您通过 ssh 连接到机器并在那里运行已安装在本地机器上的 Perl 内容。这样,您无需在遥控器上添加模块或安装任何东西。它所需要的只是任何一种或多或少最近的 Perl,幸运的是,几乎每个 Linux 都附带了它。

作者马特·特劳特(Matt Trout)有一个非常好的闪电演讲,非常值得一看。

于 2014-09-17T10:55:58.017 回答
2

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

于 2014-09-17T11:03:42.593 回答
0

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

print qq{ssh -q $cur_host "cd $log_path; echo cd $log_path; find . -type f \( -iname '*' ! -iname '*.gz' \) -mmin +1440 \;; exit 0"}, "\n";
于 2014-09-17T12:07:40.500 回答