使用Ubuntu20.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。也许有一个很好的理由不具有与物理接口相对应的类型。理由何在?
发布于 2020-05-30 23:07:24
接口类型更多地是一个链接属性,而不是一个地址属性,即使这些信息可以在ip address的S输出中使用(但并不总是可用)。因此,用于回答OP问题标题的命令是ip link show.
...but硬件接口没有关联的类型。只有虚拟接口才能做到这一点,因为它是一个附加属性,没有真正的接口(这回答了Q2,但请参阅最后的注释)。因此,没有允许显示物理类型的类型,而且由于筛选器选项中也没有可用的否定式(也没有一个表达式显示要否定的任何类型),所以在命令语法中没有过滤器只显示这样的接口。
若要查找这些接口,必须显示所有接口,并使用外部筛选器筛选出没有输入的接口。因此,仅用ip link命令无法完成的事情,可以通过使用适当的工具过滤其输出来完成:jq使用ip -details -json link的S JSON输出进行可靠的解析。这里有一个jq文档来学习如何使用它,手册页是基于它的内容的。
从完整的接口列表来看,必须这样做:
它转化为:
ip -details -json link show | jq -r '
.[] |
if .linkinfo.info_kind // .link_type == "loopback" then
empty
else
.ifname
end
'例如,在目前共有12个接口的系统上,只有这两个接口,也就是唯一的两个real接口,使用上面的命令显示:
eth0
wlan0自由地改进了这个jq过滤器。
为了解决Q1问题,在这种情况下,将ip ... link替换为ip ... address将提供相同的输出。但是,要在接口之外显示地址,过滤器当然必须更改(并且需要一个最近足够的jq命令来允许自定义处理linefeed):
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 address或ip -d -j address | jq .。-json选项可用于几个iproute2命令,但并非所有命令都可用。它对ip ...命令的添加是最近的(2017年年年中)。
注意:实际上,当在JSON中使用时,type关键字可以转换为多种不同类型的属性:.linkinfo.info_kind是前面描述的接口的实际类型,但也有一个接口(包括一个真正的接口)的.linkinfo.info_slave_kind,该接口有一个桥或一个键作为主接口(resp )。bridge_slave和bond_slave)。这不会改变JSON结果,因为它不会检查这个属性。
无论如何,这样的接口不应该设置IP地址给它们:地址应该设置为主机,尽管它是虚拟的,但是在与周围的物理环境交互时应该是重要的接口。
https://serverfault.com/questions/1019363
复制相似问题