用于检索以太网网络接口名称的 Bash 脚本

用于检索以太网网络接口名称的 Bash 脚本

在 Ubuntu 16.04 中,我编写了一个脚本,根据某些参数动态配置有线以太网接口的 IP 地址。现在的问题是,在我的脚本中,我假设名称为 eth0,但这并不总是正确的。假设我只有一个有线网络接口(不必插入),但我也可以有一个无线接口,我如何检索它的名称(仅有线接口)?

使用ifconfig命令我得到:

enp7s0    Link encap:Ethernet  HWaddr fc:3f:db:a2:6d:46  
          inet addr:192.168.0.101  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::149f:3103:af2f:1ec5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6784 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7493 errors:1 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:4565079 (4.5 MB)  TX bytes:827825 (827.8 KB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:8037 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8037 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:2261250 (2.2 MB)  TX bytes:2261250 (2.2 MB)

wlp19s0   Link encap:Ethernet  HWaddr c8:ff:28:93:26:32  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:180463 errors:0 dropped:0 overruns:0 frame:0
          TX packets:121275 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:229823414 (229.8 MB)  TX bytes:15675806 (15.6 MB)

我想要的是:

enp7s0

答案1

如果您想排除诸如virloopbackwl(无线)之类的接口,那么以下步骤应该可以解决问题。

ip link | awk -F: '$0 !~ "lo|vir|wl|^[^0-9]"{print $2;getline}'

这里我们使用冒号作为分隔符-F:,然后使用正则表达式检查该行是否与$0某个字符串不匹配。

更新: 使用-brief注释中所建议的标志,命令更改为:

ip -br l | awk '$1 !~ "lo|vir|wl" { print $1}'

答案2

因为所有接口都会显示在 下/sys/class/,例如/sys/class/net/列出所有网络接口,

可以直接使用它通过简单的关键字直接搜索并返回准确的接口名称,例如:

ls /sys/class/net | grep enp

答案3

这是最好的解决方案

ip 路由获取 8.8.8.8 | awk --'{printf $5}'

或者

echo $(ip route get 8.8.8.8 | awk -- '{printf $5}')

在 bash 脚本中你可以声明 main_interface 并在任何地方用作 $main_interface

main_interface=$(ip route get 8.8.8.8 | awk -- '{printf $5}')

答案4

诀窍是从中获取接口列表/sys/class/net,然后查看它们去往何处。

find /sys/class/net ! -type d | xargs --max-args=1 realpath | awk -F\/ '/pci/{print $NF}'

要仅根据以太网进行过滤,您必须lspci先使用 grep:

lspci  | awk '/Ethernet/{print $1}'

完整的命令变成:

pci=`lspci  | \
 awk '/Ethernet/{print $1}'`; find /sys/class/net ! -type d  | \
 xargs --max-args=1 realpath  | \
 awk -v pciid=$pci -F\/ '{if($0 ~ pciid){print $NF}}'

相关内容