有没有办法只获取物理以太网接口的名称(即不是虚拟以太网接口)?
为了提供一些背景知识,我试图让一些 SBC(RPi 3)将它们的 IP 地址写入数据库。但由于不同 SBC 上的物理以太网接口的名称通常不相同,因此我发现很难获取它们的 IP 地址。
我能想到的解决此问题的一种方法是为所有 SBC 以太网接口指定一个通用名称,例如 eth0。但这种方法感觉有点笨拙。那么,是否有其他替代方法可以仅获取物理以太网接口的名称?
答案1
您可以通过以下方式判断哪些接口是虚拟的
ls -l /sys/class/net/
这给你这个输出:
[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
从那里,您可以 grep 仅过滤非虚拟接口:
ls -l /sys/class/net/ | grep -v virtual
另一种选择是使用这个小脚本,改编自这个答案,它打印所有没有 MAC 地址 00:00:00:00:00:00 的接口的名称,即物理:
#!/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
答案2
答案3
这将为您提供一台物理设备的名称。我认为 awk 不适用于多种设备。然而,去掉 awk,你会得到所有物理名称的列表。
lshw -class network | grep -A 1 "bus info" | grep name | awk -F': ' '{print $2}'
答案4
我们需要一个没有环回的“干净的接口列表”。
我想出了两种我认为“可以”的方法。
find /sys/class/net -type l -execdir basename '{}' ';' | grep -v "^lo$"
(说明:找到 udev 为其创建符号链接的所有实际设备并获取“basename”,即文件名和接口名称 | 删除任何恰好是“lo”的行)
!!!不要在 bash 脚本中使用“ls”
和
arp | awk '{ if ( NR > 1 ) { print } }' | awk '{print $5}' | sed '/^$/d'| sort -u
(说明:给我 arp 表信息 | 如果第 1 行是 arp 表标题,则不打印 | 只打印第五列 | 删除空行 | 字母化并删除重复项)
使用 arp 命令,您可以指定“以太网”设备。
arp -t ether
我不确定这是否会摆脱“虚拟设备”。它肯定包括我的 wifi 网络接口。有了“干净的名称列表”,您可以将它们插入大多数其他命令并测试全零的 MAC 地址或虚拟属性......
我看到很多解析“ls”的答案。确实不应该这样做。很有可能网络接口的命名方式不会破坏通常的方式(即空格、换行符、其他奇怪的字符......)。此外,find、arp、awk、sed 和 sort 通常已经在每个 Linux 设备上。
我只在我的 Kubuntu 笔记本电脑上测试了我的命令。没有人付钱给我,这就是我今天的时间。我还需要获取网络接口的名称,并且我将在我的实例上使用 arp 接口,这些实例不知道它们的单个网络设备以及它们的整个存在是完全抽象的。