使用 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 link
JSON 输出,实现可靠的解析。这是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 ... link
将ip ... 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 address
或ip -d -j address | jq .
。该-json
选项适用于多种iproute2命令,但不是全部。它ip ...
最近才添加命令(2017 年中)。
注意:实际上,type
关键字在 JSON 中使用时可以转换为多种不同类型的属性:.linkinfo.info_kind
是之前描述的实际接口类型,但对于具有桥接或绑定作为主接口(分别为和).linkinfo.info_slave_kind
的接口(包括真实接口),也有。这不会改变 JSON 结果,因为它不会检查此属性。bridge_slave
bond_slave
无论如何,这样的接口永远不应该设置 IP 地址:应该将地址设置为主地址,尽管是虚拟的,但它应该是与周围的物理环境交互时重要的接口。