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