erro de sintaxe awk nova linha inesperada ou fim de string

1

/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");}"

fornece esta saída em awk: cmd. line:2: {system(/usr/sbin/conntrack awk: cmd. line:2: ^ unexpected newline or end of string

por favor ajude a depurar

    
por Dudus 24.09.2017 / 18:18

2 respostas

1

Seu script 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")}"

O script tem um problema com as citações:

O script está entre aspas duplas e também usa aspas duplas. As aspas duplas internas causarão problemas.

A solução é escrever o script entre aspas simples ( awk scripts devem estar sempre entre aspas simples, de forma que $0 etc. não seja interpretado pelo 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")}'

Você também pode mover facilmente as duas últimas chamadas grep que está fazendo para o script 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");}'

E com um pouco mais de trabalho, você pode conseguir o primeiro também:

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")}'
    
por 24.09.2017 / 18:37
0

Se você quiser excluir as entradas conntrack TCP que têm um endereço IP de origem $1 (o primeiro parâmetro para o script), uma porta de destino original de 80 e um estado ESTABLISHED , que deve ser apenas:

conntrack -D -s "$1" -p tcp --dport 80 --state ESTABLISHED

ao lado dos problemas já mencionados, a sua abordagem combinaria em linhas que têm dport=8080 , bem ou linhas que têm dport=80 no reply-to dst. E $1 in "--orig-src " $1 seria o primeiro campo na linha conforme expandido por awk , não o primeiro argumento do script. Além disso, grep 10.1.1.4 iria corresponder on 10.1.1.40 e 10.101.4.5 mesmo com grep -w ( . como um operador de expressão regular corresponde a qualquer caractere, e não é uma palavra personagem).

Se conntrack não tiver a capacidade de filtrar entradas por si só, você preferiria fazer algo como:

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)
  }'

Ou para evitar a execução de um comando sh por entrada para excluir (além de um comando 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
    
por 25.09.2017 / 17:09

Tags