这
/usr/sbin/conntrack -L |grep $1 | grep ESTAB |grep 'dport=80' | awk "{system("/usr/sbin/conntrack -D --orig-src $1 --orig-dst" substr($6,5) "-p tcp --orig-port-src " substr($7,7)" --orig-port-dst 80");}"
给出这个输出
awk: cmd. line:2: {system(/usr/sbin/conntrack awk: cmd. line:2: ^ unexpected newline or end of string
我需要调试这个。
答案1
你的awk
脚本:
awk "{system("/usr/sbin/conntrack -D --orig-src $1 --orig-dst" substr($6,5) "-p tcp --orig-port-src " substr($7,7)" --orig-port-dst 80")}"
该脚本存在引用问题:
该脚本是用双引号括起来的,并且它也使用了双引号。内部双引号会引起问题。
解决方案是将脚本放在单引号中(awk
脚本应该始终放在单引号中,这样$0
shell 就不会解释等):
awk '{system("/usr/sbin/conntrack -D --orig-src " $1 " --orig-dst " substr($6,5) " -p tcp --orig-port-src " substr($7,7) " --orig-port-dst 80")}'
grep
您还可以轻松地将您正在执行的最后两个调用移至awk
脚本中:
awk '/ESTAB/ && /dport=80/ {system("/usr/sbin/conntrack -D --orig-src " $1 " --orig-dst " substr($6,5) " -p tcp --orig-port-src " substr($7,7) " --orig-port-dst 80");}'
再做一点工作,你也可以得到第一个:
awk -v arg1="$1" 'match($0, arg1) && /ESTAB/ && /dport=80/ {system("/usr/sbin/conntrack -D --orig-src " $1 " --orig-dst " substr($6,5) " -p tcp --orig-port-src " substr($7,7) " --orig-port-dst 80")}'
答案2
如果您想删除源 IP 地址$1
(脚本的第一个参数)、原始目标端口 80 和状态的 conntrack TCP 条目ESTABLISHED
,则应该是:
conntrack -D -s "$1" -p tcp --dport 80 --state ESTABLISHED
除了已经提到的问题之外,您的方法将匹配具有dport=8080
以及的行或dport=80
具有回复目的地。 in$1
将"--orig-src " $1
是由 展开的行中的第一个字段awk
,而不是脚本的第一个参数。另外,grep 10.1.1.4
会匹配10.1.1.40
甚至10.101.4.5
与grep -w
(.
作为正则表达式运算符匹配任何字符,并且不是单词特点)。
如果conntrack
没有能力自行过滤条目,您宁愿执行以下操作:
conntrack -L | SRC=$1 awk '
$1 == "tcp" && \
$4 == "ESTABLISHED" && \
$5 == "src=" ENVIRON["SRC"] && \
$8 == "dport=80" {
dst = substr($6, 5)
sport = substr($7, 7)
system("conntrack -D -s \"$SRC\" -d "dst" --dport 80 --sport "sport)
}'
或者避免sh
为每个要删除的条目运行一个命令(除了一个conntrack
命令之外):
conntrack -L | SRC=$1 awk '
$1 == "tcp" && \
$4 == "ESTABLISHED" && \
$5 == "src=" ENVIRON["SRC"] && \
$8 == "dport=80" {
dst = substr($6, 5)
sport = substr($7, 7)
print "conntrack -D -s \"$SRC\" -d "dst" --dport 80 --sport "sport
}' | sh