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 shell 语法:;必须转义,否则 shell 会认为存在分隔符,并且后面有一个新的 shell 命令。

该表达式在 shell 中运行:

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

等价于仍在 shell 中的此表达式:

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) 开头,后跟零个或多个字母数字字符 ( a- z, A- Z, 0- 9) 和字符斜杠 ( /),反斜杠 ( \)、下划线 ( _) 和点 ( .)。使用不同字符或与关键字冲突的标识符需要用双引号 ( ") 括起来。

注意反斜杠如何( \) 仅在换行符之前才具有特殊含义(尽管与上面的描述相反,并且与/我没有找到可以自由接受的地方相反\)。如果你不想有任何问题的话总是单引号 ( ') 命令以防止外壳交互,并在内部按照您认为合适的方式进行操作。但请注意,在这些单引号内,反斜杠后跟一个空格将被视为命令的正常字符nft

所以你有几个选择:

  • 使用\+新队将单个命令拆分为多行

  • 用于;将多个命令(或具有此类语法的命令的一部分)连接到一行上。

  • 将 a 替换;为 a新队拆分两个连接的命令

  • 当交互而不是在脚本中时,您可以选择使用nft -i键入交互命令来避免 shell 交互,因此不需要特别注意避免 '' 或 ';' 的交互与 shell 一起使用,这样您就可以看到它是如何工作的。

  • 无论如何,一旦制定了规则集,最好将其存储在文件中并使用nft -f.

所以OP的第二个例子可以这样写(仍然从shell运行):

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 ; \}'

nft0.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 ; \}
^

相关内容