Фон:
Я проверяю список доступных интерфейсов в Linux с помощью команды ifconfig.
Однако формат вывода ifconfig в Ubuntu 16.04 и Ubuntu 17.10 отличается.
При дальнейшей проверке пакет net-tools был обновлен (с net-tools 1.60 до net-tools 2.10-alpha) в ubuntu17.10, а последняя версия ifconfig выводит имена сетевых интерфейсов с двоеточием (':'). В более старой версии:
$ ifconfig --version net-tools 1.60 ifconfig 1.42 (2001-04-13)
$ ifconfig
enp0s3 Соединение encap:Ethernet
В новой версии
$ ifconfig --version net-tools 2.10-альфа
$ifconfig
ens160: флаги=4163 mtu 1500
lo: флаги=73 mtu 65536
Это может привести к сбою в работе некоторых инструментов, которые учитывают или ожидают дополнительные символы «:» в выходных данных.
Вопрос:
Есть ли способ получить список сетевых интерфейсов надежным способом, так, чтобы любые изменения в формате вывода ifconfig не влияли на инструменты, использующие его? Есть ли альтернатива ifconfig, которую можно использовать согласованным образом?
решение1
Theсетевые инструментыпакет былустаревшийнекоторое время его заменял iproute2 ( ip
будучи основным инструментом в этом пакете). Многие дистрибутивы больше не поставляют net-tools как часть своей базовой установки.
Разработка net-tools с тех пор возобновилась, но это привело к тому, что ряд инструментов были улучшены способами, нарушающими совместимость, как вы видели на примере ifconfig
. Из NEWS.Debian.gz
системы Debian 9.0:
После 15 лет без разработки в апстриме, net-tools снова в работе, исправляя множество давних проблем. Плохая новость в том, что вывод многих команд изменился, и это наверняка сломает скрипты, которые полагались на его анализ.
По этой причине может быть идеей адаптировать ваши скрипты для использования инструментов iproute2. Например, ip link
должно дать вам информацию, похожую на вашу вышеприведенную ifconfig
. Единственным недостатком этого подхода является то, что он нарушает совместимость с не-Linux системами, почти все из которых используют ifconfig
.
решение2
Альтернативным способом получения списка всех интерфейсов в Linux из оболочки является чтение /proc/net/dev
, которое имеет более стабильный формат, чем вывод ifconfig(8) из net-tools
.
Например, чтобы получить имя интерфейсов:
whr@debianjessie:~$ sed -r -e 1,2d -e 's/^ +//' -e 's/: .+//' /proc/net/dev
ppp0
lo
eth0
eth1