AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1018300
Accepted
Osqui
Osqui
Asked: 2020-05-23 14:55:09 +0800 CST2020-05-23 14:55:09 +0800 CST 2020-05-23 14:55:09 +0800 CST

如何通过终端在 Nftables 中使用定义的变量(不在脚本中)

  • 772

我想在交互式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 脚本中做同样的事情效果很好(不用担心转义)。

非常感谢

firewall nftables
  • 1 1 个回答
  • 1808 Views

1 个回答

  • Voted
  1. Best Answer
    A.B
    2020-05-28T00:47:54+08:002020-05-28T00:47:54+08:00

    nft 用户空间命令使用的符号变量仅由该命令解析为它们的值。该nft命令将变量解析为其分配的值以组合最终结果。然后nft命令使用netlink API与内核通信并向它发送新规则以添加。内核从来没有看到lala=1.2.3.4也没有任何符号变量的概念。

    因此,如果您将nft命令拆分为两个调用,则会发生以下情况:

    • 第一个nft命令定义了一个符号变量供其以后使用。但是什么都不做。它甚至不必与内核通信,因为不需要更改规则集。(实际上它确实进行了通信,但发送“无”,就像使用命令一样nft '')。在命令结束时,符号的定义丢失,没有被使用。

    • 该命令的第二次调用nft需要解析$lala符号,但找不到定义:nft因错误而停止。

    所以这必须在一次 nft调用中完成,所以第二个语句仍然知道符号变量。有多种方法可以做到这一点。我在 shell 下面的示例中留下了nft不应输入的提示。

    • 交互的nft

      -i, --interactive
      从交互式 readline CLI 读取输入。您可以使用quit退出,或使用 EOF 标记,通常是 CTRL-D。

      # nft -i
      nft> define lala=1.2.3.4
      nft> add rule ip filter input ip saddr $lala accept
      nft> quit
      
    • 一次nft调用中的两个命令。

      # nft 'define lala=1.2.3.4; add rule ip filter input ip saddr $lala accept'
      

      请注意所需的额外内容;,因为在此上下文中nft接收一行参数,但应将它们拆分为两个逻辑命令。它也nft有自己的解析器,它不关心命令是作为单个命令参数还是多个单独的参数接收的。在这里,所有内容都包含在一对中,''以避免;和$字符的外壳问题。

    • 然后nft可以选择从文件中读取。从文件读取时,所有输入都是同一nft命令上下文的一部分。

      -f, --file filename
      从文件名读取输入。如果文件名是 -,从标准输入读取。

      nft 脚本必须启动#!/usr/sbin/nft -f

      因此,使用名为test.nft具有此内容的文件:

      define lala=1.2.3.4
      add rule ip filter input ip saddr $lala accept
      

      然后可以使用它:

      # nft -f test.nft
      

      下面的变体以“ nftables语言”执行脚本。文件test.nft内容为:

      #!/usr/sbin/nft -f
      define lala=1.2.3.4
      add rule ip filter input ip saddr $lala accept
      

      然后:

      # chmod a+rx test.nft
      # ./test.nft
      

      这也有效:

      # nft -f - <<'EOF'
      > define lala=1.2.3.4
      > add rule ip filter input ip saddr $lala accept
      > EOF
      

    对于之前的每个命令,生成的规则集都是相同的(假设表和链是之前创建的):

    # nft list chain ip filter input
    table ip filter {
        chain input {
            type filter hook input priority filter; policy accept;
            ip saddr 1.2.3.4 accept
        }
    }
    

    将不再有任何$lala留下的痕迹:内核从未收到$lala,但只有1.2.3.4这就是它所返回的。

    • 2

相关问题

  • 用 D-LINK DFL-CPG310 防火墙替换 Cisco Pix 防火墙

  • MSMQ 防火墙端口

  • IP-KVM(在我的例子中是 ADDER Ipeps):轻松防火墙穿越

  • 远程连接 sql server 不工作,但如果防火墙禁用它呢?

  • 服务器 2003 R2 上的 Cisco VPN 客户端

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve