逻辑上我的意思是命令中所有合法的内容
ip link
,例如:
ip link add link dum0 name dum0.200 type vlan protocol 802.1Q id 200
其中逻辑类型为“vlan”。引用手册页,所有有效类型都是:
VLAN |维思 | vcan |假人 |如果b | macvlan | macvtap |可以|桥梁| ipoib | ip6tnl | ipip |坐| vxlan |gre |格雷塔普 | ip6gre | ip6gretap | ip6gretap |瓦特
请注意,这显然不是所要求的物理设备类型(如以太网、wifi、ppp 等)这个问题,其中确实包含一个参考宝石导致我对其进行测试的物理类型:
find /sys/class/net ! -type d | xargs --max-args=1 realpath |
while read d; do
b=$(basename $d) ; n=$(find $d -name type) ; echo -n $b' ' ; cat $n;
done
dum0.200 1
dum0.201 1
dum1.300 1
dum1.301 1
dummy0 1
ens36 1
ens33 1
lo 772
dum0 1
dum1 1
wlan0 1
但显然发现虚拟、vlan 和 wlan 设备都是 ARPHRD_ETHER 类型。
有人知道更多吗?提前致谢。
====
2023 年对此进行修改。
它来自一个具有两个真实以太网接口、一个 wifi、已安装但不活动的 docker、具有两个网络、两个虚拟机和一个 wirguard 连接的 libvirt 的系统。 jq 来自 stedolan.github.io/jq,通常与一个不错的包管理器一起安装。
$ ip -details -j l | jq -r '.[]|"\(.ifname), \(.link_type), \(.linkinfo.info_data.type), \(.linkinfo.info_kind), \(.linkinfo.info_slave_kind)"' | column -t -s ','
lo loopback null null null
enp43s0 ether null null null
enx00e04c680049 ether null null null
wlp0s20f3 ether null null null
virbr2 ether null bridge null
virbr1 ether null bridge null
docker0 ether null bridge null
vnet0 ether tap tun bridge
vnet1 ether tap tun bridge
vnet2 ether tap tun bridge
vnet3 ether tap tun bridge
wg0 none null wireguard null
$
答案1
更简单的解决方案:
ip -details link show
对于虚拟设备,设备类型显示在第三行。
答案2
有一种方法可以循环所有可用类型,并显示每种类型的所有接口(使用ip link show type <type>
)。由此,我们可以收集所有类型的接口,然后解析出我们想要了解的接口。它并不优雅,但有效:
使用bash:
#!/bin/bash
# Arguments: $1: Interface ('grep'-regexp).
# Static list of types (from `ip link help`). NOTE: On my machine, not all types are listed there, e.g. the type `tun`. And the list of types may change over time. So do not ultimately rely on this list here!:
TYPES=(bareudp bond bond_slave bridge can dummy erspan geneve gre gretap hsr ifb ip6erspan ip6gre ip6gretap ip6tnl ipip ipoib ipvlan ipvtap lowpan macsec macvlan macvtap netdevsim nlmon rmnet sit tap tun vcan veth vlan vrf vti vxcan vxlan xfrm)
iface="$1"
for type in "${TYPES[@]}"; do
ip link show type "${type}" | grep -E '^[0-9]+:' | cut -d ':' -f 2 | sed 's|^[[:space:]]*||' | while read _if; do
echo "${_if}:${type}"
done | grep "^${iface}"
done
将其保存到文件中,使其可执行,然后使用您想了解的界面作为参数运行它。
对于链接上的dum0.200
bee 类型的示例(使用 创建),输出将为,表明它的类型为。请注意,如果愿意,可以将其从其中解析出来。vlan
eth0
ip link add link eth0 name dum0.200 type vlan protocol 802.1Q id 200
dum0.200@eth0:vlan
vlan
@eth0
ip link show
由于此脚本的参数被解释为 -regexp grep
,因此不指定任何内容会列出所有ip link show type <type>
输出,或者仅指定前缀列出一些输出,等等。
笔记: (2021年5月12日添加):“普通”以太网设备和环回设备似乎没有任何类型。所以脚本将不是列出它们。如果还需要列出没有类型的设备,则需要对其进行扩展或重写。