使用“ip address show type”显示物理网络接口

使用“ip address show type”显示物理网络接口

使用 Ubuntu 20.04。我已经学会了如何获取物理以太网接口的名称?为了仅显示物理网络接口,我们可以这样做

ls -l /sys/class/net/ | grep -v virtual

我尝试(但没有成功)使用 获取相同的信息ip address show type XXX。根据ip address help可能的类型有:

TYPE := { vlan | veth | vcan | vxcan | dummy | ifb | macvlan | macvtap |
          bridge | bond | ipoib | ip6tnl | ipip | sit | vxlan | lowpan |
          gre | gretap | erspan | ip6gre | ip6gretap | ip6erspan | vti |
          nlmon | can | bond_slave | ipvlan | geneve | bridge_slave |
          hsr | macsec | netdevsim }

Q1. 是否可以ip address仅显示物理接口?例如,查看机器的本地 IP 地址。

Q2. 没有与物理接口对应的类型可能有充分的理由。理由是什么?

答案1

接口类型更多是关联财产比地址属性,即使此信息在 的输出中可用(但并非总是如此)ip address。因此,用于回答标题OP 的问题是ip link show......

...但硬件接口没有关联类型。只有虚拟接口才有,因为它是附加财产没有真正的接口(这回答了问题 2,但请参阅最后的注释)。因此,没有允许显示物理接口的类型,并且过滤器选项中也没有可用的否定(也没有要显示的表达式任何输入否定),命令语法中没有可用的过滤器来显示仅有的这样的接口。

要找到这些接口,您必须显示所有接口,并使用外部过滤器过滤掉没有类型的接口。因此,仅使用命令无法完成的事情ip link可以通过使用适当的工具过滤其输出来完成:jq使用ip -details -json linkJSON 输出,实现可靠的解析。这是jq文档要了解如何使用它,请参阅手册页以了解其内容。

从完整的接口列表中,必须完成以下操作:

  • 排除任何找到的类型(在 JSON 输出中,这是信息种类的财产友情链接,可以是帮助中的所有类型(虚拟局域网韦特, ...), 不要与链接类型例如回送没有任何...)。
  • 排除环回链接类型

翻译过来就是:

ip -details -json link show | jq -r '
.[] | 
      if .linkinfo.info_kind // .link_type == "loopback" then
          empty
      else
          .ifname
      end
'

例如,在这个当前总共有 12 个接口的系统上,使用上面的命令仅显示这两个接口,即仅有的两个真实的接口:

eth0
wlan0

可以随意改进杰奇筛选。

为了回答问题 Q1,在这种情况下,用 替换ip ... linkip ... address得到相同的输出。但要显示接口之外的地址,过滤器当然必须更改(并且需要足够新的jq命令才能允许自定义换行符处理):

ip -details -json address show | jq --join-output '
.[] | 
      if .linkinfo.info_kind // .link_type == "loopback" then
          empty
      else
          .ifname ,
          ( ."addr_info"[] |
              if .family == "inet" or .family == "inet6" then
                  " " + .local
              else
                  empty
              end
          ),
          "\n"
      end
'

如果你想直接检查整个 JSON 输出,请尝试ip -details -pretty -json addressip -d -j address | jq .。该-json选项适用于多种iproute2命令,但不是全部。它ip ...最近才添加命令(2017 年中)。


注意:实际上,type关键字在 JSON 中使用时可以转换为多种不同类型的属性:.linkinfo.info_kind是之前描述的实际接口类型,但对于具有桥接或绑定作为主接口(分别为和).linkinfo.info_slave_kind的接口(包括真实接口),也有。这不会改变 JSON 结果,因为它不会检查此属性。bridge_slavebond_slave

无论如何,这样的接口永远不应该设置 IP 地址:应该将地址设置为主地址,尽管是虚拟的,但它应该是与周围的物理环境交互时重要的接口。

相关内容