【问题标题】:awk remote ssh commandawk 远程 ssh 命令
【发布时间】: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 运行它。这种方法有时有助于嵌套转义要求...

标签: bash shell ssh awk


【解决方案1】:

您还需要转义单引号。比如第一个脚本……

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
'

……必须写成:

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
'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 2016-12-16
    • 2011-05-27
    • 2018-04-21
    • 2018-03-03
    • 2015-03-29
    • 2019-05-19
    相关资源
    最近更新 更多