如何仅获取物理以太网接口的名称?

yas*_*ash 3 linux networking network-interface

有没有办法只获取物理以太网接口的名称(即不是虚拟以太网接口)?
为了提供一些背景知识,我试图让一些 SBC(RPi 3)将它们的 IP 地址写入数据库。但是由于不同 SBC 上物理以太网接口的名称通常不同,我发现很难获得它们的 IP 地址。
我能想到的解决这个问题的一种方法是为所有 SBC 以太网接口提供一个通用名称,如 eth0。但是这个方法感觉有点笨拙。那么,有没有其他方法可以只获取物理以太网接口的名称?

小智 8

受到现有答案的启发,该答案命名了有用的/sys/class/net目录并警告不要使用 ls并且我只需要查看名称而不是周围的材料,我想出了以下单个命令:

find /sys/class/net -mindepth 1 -maxdepth 1 -lname '*virtual*' -prune -o -printf '%f\n'
Run Code Online (Sandbox Code Playgroud)

这将为您提供所有非环回和非虚拟接口的列表:

$ find /sys/class/net -mindepth 1 -maxdepth 1 -lname '*virtual*' -prune -o -printf '%f\n'
eth1
eth0
Run Code Online (Sandbox Code Playgroud)


dr_*_*dr_ 7

您可以通过以下方式判断哪些接口是虚拟的

ls -l /sys/class/net/
Run Code Online (Sandbox Code Playgroud)

这给你这个输出:

[root@centos7 ~]# ls -l /sys/class/net/
total 0
lrwxrwxrwx. 1 root root 0 Mar 20 08:58 ens33 -> ../../devices/pci0000:00/0000:00:11.0/0000:02:01.0/net/ens33
lrwxrwxrwx. 1 root root 0 Mar 20 08:58 lo -> ../../devices/virtual/net/lo
lrwxrwxrwx. 1 root root 0 Mar 20 08:58 virbr0 -> ../../devices/virtual/net/virbr0
lrwxrwxrwx. 1 root root 0 Mar 20 08:58 virbr0-nic -> ../../devices/virtual/net/virbr0-nic
Run Code Online (Sandbox Code Playgroud)

从那里,您可以 grep 仅过滤非虚拟接口:

ls -l /sys/class/net/ | grep -v virtual
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用这个改编自这个答案的小脚本,它打印所有没有 00:00:00:00:00:00 的 MAC 地址的接口的名称,即物理:

#!/bin/bash

for i in $(ip -o link show | awk -F': ' '{print $2}')
do
    mac=$(ethtool -P $i)
    [[ $mac != *"00:00:00:00:00:00"* ]] && echo "$i"
done
Run Code Online (Sandbox Code Playgroud)