我想在交互式shell中运行这两个命令,一个接一个(作为root并加载“过滤器”表和“输入”链):
nft define lala=1.2.3.4
nft add rule ip filter input ip saddr \$lala accept
您可以看到我转义了“$”以避免外壳扩展。但我收到此错误消息“未知标识符'lala'”。如果我不转义“$”,则会收到以下错误消息:“语法错误,意外接受”。如果我改写\$$lala,我会收到以下错误消息:“语法错误,未接收的接受,期望字符串”,并且显示了这个错误的规则:添加规则 ip 过滤器输入 ip saddr $ 接受。
那么,在交互式 shell 中使用 Nft 变量的正确语法是什么。在 Nft 脚本中做同样的事情效果很好(不用担心转义)。
非常感谢
nft
用户空间命令使用的符号变量仅由该命令解析为它们的值。该nft
命令将变量解析为其分配的值以组合最终结果。然后nft
命令使用netlink API与内核通信并向它发送新规则以添加。内核从来没有看到lala=1.2.3.4
也没有任何符号变量的概念。因此,如果您将
nft
命令拆分为两个调用,则会发生以下情况:第一个
nft
命令定义了一个符号变量供其以后使用。但是什么都不做。它甚至不必与内核通信,因为不需要更改规则集。(实际上它确实进行了通信,但发送“无”,就像使用命令一样nft ''
)。在命令结束时,符号的定义丢失,没有被使用。该命令的第二次调用
nft
需要解析$lala
符号,但找不到定义:nft
因错误而停止。所以这必须在一次
nft
调用中完成,所以第二个语句仍然知道符号变量。有多种方法可以做到这一点。我在 shell 下面的示例中留下了nft
不应输入的提示。交互的
nft
一次
nft
调用中的两个命令。请注意所需的额外内容
;
,因为在此上下文中nft
接收一行参数,但应将它们拆分为两个逻辑命令。它也nft
有自己的解析器,它不关心命令是作为单个命令参数还是多个单独的参数接收的。在这里,所有内容都包含在一对中,''
以避免;
和$
字符的外壳问题。然后
nft
可以选择从文件中读取。从文件读取时,所有输入都是同一nft
命令上下文的一部分。因此,使用名为
test.nft
具有此内容的文件:然后可以使用它:
下面的变体以“ nftables语言”执行脚本。文件
test.nft
内容为:然后:
这也有效:
对于之前的每个命令,生成的规则集都是相同的(假设表和链是之前创建的):
将不再有任何
$lala
留下的痕迹:内核从未收到$lala
,但只有1.2.3.4
这就是它所返回的。