nftables 구문의 백슬래시(\) 위치

nftables 구문의 백슬래시(\) 위치

웹 페이지에서는 다음과 같이 설명합니다.
nftables 가이드

; = more commands or parameters to follow
\ = break a rule into multiple lines

명령의 경우:

nft add chain ip traffic-filter output { type filter hook output priority 0 \; policy accept\; }

나는 그것을 다음과 같이 읽었다.

nft add chain ip traffic-filter output { 
          type filter hook output priority 0 ; 
          policy accept ; 
}

나를 혼란스럽게 만드는 것은 다음과 같이 줄을 끊기 위해 \뒤에 두지 않는 이유 입니다.:

nft add chain ip traffic-filter output { type filter hook output priority 0 ;\ policy accept ; \}

?

답변1

이것은 아무 관련이 없습니다nftables구문이지만 POSIX 셸 구문의 경우: ;이스케이프해야 합니다. 그렇지 않으면 셸은 구분 기호가 있다고 생각하고 새 셸 명령이 뒤따릅니다.

이 표현식은 셸에서 실행됩니다.

nft add chain ip traffic-filter output { type filter hook output priority 0 \; policy accept\; }

셸에 있는 다음 표현식과 동일합니다.

nft add chain ip traffic-filter output '{ type filter hook output priority 0 ; policy accept; }'

또는 많은 유사한 가능성 중 하나입니다( nft매개변수 분할 자체를 수행하므로 매개변수가 그룹화되는 방식은 중요하지 않습니다).

nft 'add chain ip traffic-filter output { type filter hook output priority 0 ; policy accept; }'

탈출구가없는쉘용이런 일이 발생할 수 있습니다:

# nft add chain ip traffic-filter output { type filter hook output priority 0 ; policy accept; }
bash: syntax error near unexpected token `}'

오류는 에서 발생하지 bash않습니다 nft.


어느무작위 비공식 문서맹목적으로 신뢰하지 마십시오. 이 문자의 사용은 \매뉴얼 페이지(nft(8)):

어휘 규칙

입력은 한 줄씩 구문 분석됩니다.행의 마지막 문자(개행 문자 앞)가 인용되지 않은 백슬래시( \)인 경우 다음 행은 연속으로 간주됩니다.. 같은 줄에 있는 여러 명령은 ;세미콜론( )으로 구분할 수 있습니다.

파운드 기호( #)는 주석을 시작합니다. 같은 줄의 모든 후속 문자는 무시됩니다.

식별자는 알파벳 문자( a- z, A- Z)로 시작하고 그 뒤에 0개 이상의 영숫자 문자( a- z, A- Z, 0- 9)와 문자 슬래시( /)가 옵니다.백슬래시( \), 밑줄( _) 및 점( .). 다른 문자를 사용하거나 키워드와 충돌하는 식별자는 "큰따옴표( )로 묶어야 합니다 .

백슬래시가 어떻게 사용되는지 확인하세요.( \)는 개행 문자 앞에만 특별한 의미가 있습니다.(위의 설명과 달리, /자유롭게 받아들일 수 있는 곳을 찾지 못하더라도 \). 문제가 생기고 싶지 않다면항상 작은따옴표( ') 명령쉘 상호작용을 방지하고 내부적으로 적합하다고 생각되는 대로 수행하십시오. 그러나 이러한 작은따옴표 내에서 백슬래시 뒤에 공백이 오는 경우 다음과 같이 처리됩니다.명령의 일반 문자입니다 nft.

따라서 몇 가지 옵션이 있습니다.

  • \+ 사용새로운 팀단일 명령을 여러 줄로 분할

  • ;여러 명령(또는 해당 구문이 포함된 명령의 일부)을 한 줄에 연결하는 데 사용됩니다 .

  • a를 ;a로 교체하다새로운 팀두 연결을 분할하는 명령

  • 스크립트가 아닌 상호 작용할 때 nft -i입력된 대화형 명령을 사용하여 쉘 상호 작용을 피하도록 선택할 수 있으므로 작동 방식을 볼 수 있도록 쉘과의 '' 또는 ';' 상호 작용을 피하는 데 특별한 주의가 필요하지 않습니다.

  • 그럼에도 불구하고 규칙 세트를 개발한 후에는 이를 파일에 저장하고 사용하는 것이 가장 좋습니다 nft -f.

따라서 OP의 두 번째 예는 다음과 같이 작성할 수 있습니다(여전히 셸에서 실행됨).

nft 'add chain ip traffic-filter output { type filter hook output priority 0;\
policy accept;\
}
'

그러나 ;연결과 행 연결이 모두 쓸모 없게 되면 다음과 같이 간단하게 만들 수 있습니다.

nft 'add chain ip traffic-filter output { type filter hook output priority 0
policy accept
}
'

백슬래시 뒤에 개행 문자가 오지 않으므로 다음 표기법은 유효하지 않습니다.

nft 'add chain ip traffic-filter output { type filter hook output priority 0 ;\ policy accept ; \}'

nft버전 0.9.8에서는 위 문제와 관련하여 여러 오류가 발생합니다.

Error: syntax error, unexpected junk
add chain ip traffic-filter output { type filter hook output priority 0 ;\ policy accept ; \}
                                                                         ^
Error: syntax error, unexpected junk
add chain ip traffic-filter output { type filter hook output priority 0 ;\ policy accept ; \}
                                                                                           ^
Error: syntax error, unexpected end of file
add chain ip traffic-filter output { type filter hook output priority 0 ;\ policy accept ; \}
^

관련 정보