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

rok*_*rok 8 networking scripting ubuntu bash linux-networking

在 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)
Run Code Online (Sandbox Code Playgroud)

我想要的是:

enp7s0
Run Code Online (Sandbox Code Playgroud)

小智 10

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

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

ls /sys/class/net | grep enp

  • 如果您还想包含像“eth0”这样的接口,请将 grep 从 `enp` 更改为 `^e`,它将同时匹配 eth* 和 enp* (3认同)

小智 7

这是最好的解决方案

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

或者

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

在 bash 脚本中,您可以声明 main_interface 并在任何地方使用 $main_interface

main_interface=$(ip 路由获取 8.8.8.8 | awk -- '{printf $5}')


Val*_*ami 6

如果你想排除像vir,loopbackwl( 无线 ) 这样的接口,那么下面的方法应该可以解决问题。

ip link | awk -F: '$0 !~ "lo|vir|wl|^[^0-9]"{print $2;getline}'
Run Code Online (Sandbox Code Playgroud)

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