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

Pol*_*ase 7 ip linux-networking

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

ls -l /sys/class/net/ | grep -v virtual
Run Code Online (Sandbox Code Playgroud)

我尝试(未成功)使用 获取相同的信息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 }
Run Code Online (Sandbox Code Playgroud)

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

Q2。也许没有与物理接口相对应的类型是有充分理由的。理由是什么?

A.B*_*A.B 8

接口类型更像是一个链接属性而不是地址属性,即使此信息可以(但并非总是)在 的ip address输出中可用。所以用来回答OP问题标题的命令是ip link show......

...但是硬件接口没有关联的类型。只有虚拟接口才能得到这个,因为它是一个没有真实接口的附加属性(这回答了问题2,但请参阅最后的注释)。因此,没有类型允许显示物理接口,并且由于过滤器选项中也没有可用的否定(也没有用于显示任何类型进行否定的表达式),因此命令语法中没有可用的过滤器来显示此类接口。

要找到这些接口,您必须显示所有接口,并使用外部过滤器过滤掉那些没有类型的接口。因此,仅使用该命令无法完成的事情ip link可以通过使用适当的工具过滤其输出来完成:jq使用ip -details -json link的 JSON 输出,进行可靠的解析。有这个jq文档可以学习如何使用它,手册页基于其内容。

从接口的完整列表来看,必须这样做:

  • 排除找到的任何类型(在 JSON 输出中,这是linkinfoinfo_kind属性,它可以是帮助中的所有类型(vlanveth,...),不要与link_type混淆,例如可以是环回乙醚...)。
  • 排除环回link_type

翻译为:

ip -details -json link show | jq -r '
.[] | 
      if .linkinfo.info_kind // .link_type == "loopback" then
          empty
      else
          .ifname
      end
'
Run Code Online (Sandbox Code Playgroud)

例如,在当前总共有 12 个接口的系统上,只有这两个,唯一的两个真实接口,通过上面的命令显示:

eth0
wlan0
Run Code Online (Sandbox Code Playgroud)

自由地改进这一点jq过滤器。

为了解决问题 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
'
Run Code Online (Sandbox Code Playgroud)

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


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

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