Назад | Перейти на главную страницу

Bash-скрипт для получения имени сетевого интерфейса Ethernet

В Ubuntu 16.04 я сделал сценарий для динамической настройки IP-адреса проводного интерфейса Ethernet на основе определенных параметров. Теперь проблема в том, что в моем сценарии я предполагаю, что имя - 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

Поскольку все интерфейсы будут отображаться под /sys/class/, Такие как /sys/class/net/ перечисление всех сетевых интерфейсов,

можно напрямую использовать этот прямой поиск и вернуть точное имя интерфейса с помощью простого ключевого слова, например:

ls /sys/class/net | grep enp

Если вы хотите исключить такие интерфейсы, как vir , loopback и wl(беспроводной), то следующее должно помочь.

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

Здесь мы используем двоеточие в качестве разделителя -F: затем проверьте, если строка $0 не соответствует определенной строке с использованием регулярного выражения.

Предположим, у вас есть только один физический интерфейс, а не какой-то интерфейс wlan и т. Д. Хитрость заключается в том, чтобы получить интерфейсы. Которые находятся в / sys / class / net, а потом посмотрите, куда они идут.

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

Если у вас больше интерфейсов, вам нужно сначала выполнить команду grep lspci:

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}}'

Я бы использовал ifconfig(немного устаревший и устаревший) инструмент или ip команда. С помощью ip route у вас есть список доступных маршрутов. Затем получите только строку, содержащую дефолт с участием grep и удалите ненужные символы из строки, используя sed

полная команда выглядит так:

ip route | grep default | sed -e "s/^.*dev.//" -e "s/.proto.*//"

Вот лучшее решение

ip route get 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}')