【发布时间】:2015-01-03 23:09:27
【问题描述】:
我有一个运行远程 awk 命令的 bash 脚本,但我想我没有正确转义特殊字符,因为远程服务器上没有生成文件。我仍然没有错误。
我的变量是在本地声明的,可以毫无问题地远程使用(脚本的其他部分确认了这一点)。
ssh -q -t server '
logfiles=$(find /var/log/httpd/ -type f -name *access_log -cmin -'"$past"')
for log in $logfiles;
awk -vDate=\`date -d'now-'"$past"' minutes' +[%d/%b/%Y:%H:%M:%S\` ' { if \(\$4 > Date\) print \$0}' $log | sort |uniq -c |sort -n | tail | cut -d " " -f 11,15,16
done
'
谢谢!
EDIT1:
传递这个脚本
#!/bin/bsh
logfiles=$(find /var/log/httpd/ -type f -name *access_log -cmin -120)
for log in $logfiles; do
awk -vDate=`date -d'now-120 minutes' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date) print $0}' $log | sort |uniq -c |sort -n | tail | cut -d " " -f 11,15,16 > /root/httpd.log;
done
像这样工作
ssh 用户@host 当我从控制台运行相同的脚本时: 所以我试图逃避括号 然后什么都没有生成。 在服务器上生成文件但为空:ssh -q -t $apache '
logfiles=$(find /var/log/httpd/ -type f -name *access_log -cmin -120)
for log in $logfiles; do
awk -vDate=`date -d'now-120 minutes' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date) print $0}' $log | sort |uniq -c |sort -n | tail | cut -d " " -f 11,15,16 > /root/httpd.log;
done'
-bash: syntax error near unexpected token `('
ssh -q -t $apache '
logfiles=$(find /var/log/httpd/ -type f -name *access_log -cmin -120)
for log in $logfiles; do
awk -vDate=`date -d'now-120 minutes' +[%d/%b/%Y:%H:%M:%S` ' { if \($4 > Date\) print $0}' /var/log/httpd/royalcanin_com.access_log | sort |uniq -c |sort -n | tail | cut -d " " -f 11,15,16 > /root/httpd.log;
done'
编辑2:
awk -vDate=\`date -d'now-120 minutes' +[%d/%b/%Y:%H:%M:%S\` ' { if '"($4 > Date)"' print $0}' $log | sort |uniq -c |sort -n | tail | cut -d " " -f 11,15,16 > /root/httpd.log;done'
【问题讨论】:
-
我认为你在
for之后缺少do。 -
你不必逃避
$(等 -
你也不应该像这样循环 find 的输出。带有空格的文件名或带有 shell 元字符的文件名是不安全的。
-
您必须在开始单引号之前插入一个或多个空格:
server ' -
我建议把它写成一个脚本,就好像它要通过远程系统上的终端运行一样,然后以
ssh user@host < script.sh运行它。这种方法有时有助于嵌套转义要求...