awk 구문 오류 예기치 않은 새 줄 또는 문자열 끝

awk 구문 오류 예기치 않은 새 줄 또는 문자열 끝

이것 /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

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

$1소스 IP 주소(스크립트의 첫 번째 매개변수), 원래 대상 포트 80 및 status 에 대한 conntrack TCP 항목을 제거하려는 경우 ESTABLISHED다음과 같습니다.

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

이미 언급한 문제 외에도 귀하의 방법은 dport=8080행을 및 또는 dport=80다음과 일치시킵니다.회신하다목적지. in은 스크립트의 첫 번째 인수가 아니라 로 확장된 줄의 첫 번째 필드가 됩니다 $1. 또한 정규식 연산자로 ( 를 사용하는 경우에도 모든 문자 와 일치 하지만 그렇지 않습니다."--orig-src " $1awkgrep 10.1.1.410.1.1.4010.101.4.5grep -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

관련 정보