如何在linux上找到物理接口(没有桥接,别名,vlan ...)

时间:2016-05-02 06:36:15

标签: linux bash networking

我需要识别(Debian)Linux上的物理接口 如果显示到/ sys / class / net我会看到所有接口,包括网桥和vlan。

或者bash可以检查一个接口是否存在以及它是物理的还是虚拟的?

5 个答案:

答案 0 :(得分:3)

检查位于DEVTYPE的{​​{1}}文件中的uevent参数。

在我的网桥界面中:

/sys/class/net/<interface>/uevent

虽然创建桥的真实物理接口没有参数:

$ cat /sys/class/net/br0/uevent 
DEVTYPE=bridge
INTERFACE=br0
IFINDEX=3

答案 1 :(得分:0)

两种可能的解决方案

  1. device文件夹中显示/sys/class/net/< interface >/符号链接,它只出现在物理接口上

  2. 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