III我正在编写一个Perl脚本,需要通过SSH连接到众多远程服务器来执行一些日志文件的压缩。在接下来的行中,我一直收到此错误,并且正在努力确定导致此错误的原因。我得到的错误是;
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,所以我可以看看我是否可以先解决这个问题。
感谢。
答案 0 :(得分:2)
这可能不会回答你的问题,但我想提出一个不错的选择。
您说您无法在生产服务器上安装其他模块。你需要运行一堆东西,你正在寻找文件并压缩它们。这一切都可以在Perl中完成,并且您可能比通过Perl脚本执行命令行操作更多地控制它。方法
看看Object::Remote,这是为了这个目的而编写的。它允许您在机器上运行并运行已安装在本地计算机上的Perl。这样,您无需在遥控器上添加模块或安装任何东西。所有它需要的是任何或多或少的最新Perl,幸运的是几乎每个Linux都附带。
有a very good lightning talk about it by the author马特特劳特值得一看。
答案 1 :(得分:2)
您需要反斜杠贝壳的括号。在双引号中使用单反斜杠是不够的,Perl删除了反斜杠。使用双反斜杠\\(
。
答案 2 :(得分: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";