Чтобы преодолеть различия в формате ifconfig Ubuntu16.04 и Ubuntu17.01

Чтобы преодолеть различия в формате ifconfig Ubuntu16.04 и Ubuntu17.01

Фон:

Я проверяю список доступных интерфейсов в 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

Связанный контент