我需要识别(Debian)Linux上的物理接口 如果显示到/ sys / class / net我会看到所有接口,包括网桥和vlan。
或者bash可以检查一个接口是否存在以及它是物理的还是虚拟的?
答案 0 :(得分:3)
检查位于DEVTYPE
的{{1}}文件中的uevent
参数。
在我的网桥界面中:
/sys/class/net/<interface>/uevent
虽然创建桥的真实物理接口没有参数:
$ cat /sys/class/net/br0/uevent
DEVTYPE=bridge
INTERFACE=br0
IFINDEX=3
答案 1 :(得分:0)
两种可能的解决方案
在device
文件夹中显示/sys/class/net/< interface >/
符号链接,它只出现在物理接口上
ip -d show link你可以找到不同类型的界面
if [[ ! `ip -d link show ${int_name} 2>/dev/null >/dev/null` ]]; then
echo "Interface ${int_name} does not exists"
elif [[ `ip -d link show ${int_name} | tail -n +2 | grep loopback` ]] ; then
echo is_local
elif [[ `ip -d link show ${int_name} | tail -n +2 | grep vlan` ]] ; then
echo is_vlan
elif [[ `ip -d link show ${int_name} | tail -n +2 | grep bridge` ]] ; then
echo is_bridge
else
echo is_physic
fi
答案 2 :(得分:0)
使用systemd更好的解决方案(例如关于带有vlan / bridge的树莓派)
systemctl -a | grep net-devices | grep -v "/sys/subsystem"
答案 3 :(得分:0)
扩展解决方案,适用于pi和其他设备linke tinker board / rock64
systemctl -a | grep sys-devices-platform | grep '\-net-' | awk '{n=split($1,A,"-"); print A[n]}' | cut -d"." -f1
答案 4 :(得分:0)
一种方法是匹配/sys/class/net/
中的符号链接路径:
$ ls -la /sys/class/net/
lrwxrwxrwx 1 root root 0 18. 5. 04:51 docker0 -> ../../devices/virtual/net/docker0
lrwxrwxrwx 1 root root 0 18. 5. 04:51 eno1 -> ../../devices/pci0000:00/0000:00:19.0/net/eno1
lrwxrwxrwx 1 root root 0 18. 5. 04:51 enp9s0 -> ../../devices/pci0000:00/0000:00:1c.5/0000:09:00.0/net/enp9s0
lrwxrwxrwx 1 root root 0 18. 5. 04:51 lo -> ../../devices/virtual/net/lo
lrwxrwxrwx 1 root root 0 18. 5. 19:17 macvtap0 -> ../../devices/virtual/net/macvtap0
所有虚拟接口都有 /devices/virtual/net/
路径。
因此,您可以使用find
来匹配不包含*/devices/virtual/net/*
的所有链接:
$ find /sys/class/net/ -type l ! -lname '*/devices/virtual/net/*'
/sys/class/net/eno1
/sys/class/net/enp9s0
这可以变成脚本:
#!/bin/bash
for iface in $(find /sys/class/net/ -type l ! -lname '*/devices/virtual/net/*' -printf '%f ');
do
echo "$iface is not virtual"
done
示例输出:
# ./ifs.sh
eno1 is not virtual
enp9s0 is not virtual