正如网页所描述的:
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 ; \}'
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 ; \}
^