Использование `ip address show type` для отображения физического сетевого интерфейса

Использование Ubuntu 20.04. Я узнал в Как получить только имя физического интерфейса Ethernet? , что для отображения только физических сетевых интерфейсов мы могли бы сделать

ls -l /sys/class/net/ | grep -v virtual

Я попытался (безуспешно) получить ту же информацию, используя ] IP-адрес типа XXX . Согласно справке по IP-адресу возможные типы:

TYPE := { vlan | veth | vcan | vxcan | dummy | ifb | macvlan | macvtap |
          bridge | bond | ipoib | ip6tnl | ipip | sit | vxlan | lowpan |
          gre | gretap | erspan | ip6gre | ip6gretap | ip6erspan | vti |
          nlmon | can | bond_slave | ipvlan | geneve | bridge_slave |
          hsr | macsec | netdevsim }

Q1. Можно ли использовать IP-адрес для отображения только физических интерфейсов? Например, чтобы увидеть локальные IP-адреса машины.

Q2. Может быть, есть веская причина, по которой нет типа, соответствующего физическому интерфейсу. Каково обоснование?

1
задан 30 May 2020 в 23:50
1 ответ

Тип интерфейса больше относится к свойству ссылка, чем к свойству адрес, даже если эта информация может быть доступна (но не всегда) в IP-адрес . Таким образом, команда, которую следует использовать для ответа на заголовок вопроса OP, будет ip link show ...

... но аппаратный интерфейс не имеет связанного типа.Только виртуальные интерфейсы получают это просто потому, что это дополнительное свойство, у которого нет реального интерфейса (это ответ на вопрос 2, но см. примечание в конце). Таким образом, нет типа, позволяющего отображать физические типы, и, поскольку в параметрах фильтра нет доступного отрицания (ни выражения для отображения любого типа для отрицания), в синтаксисе команды нет фильтра, доступного для отображать только такие интерфейсы.

Чтобы найти эти интерфейсы, вы должны отобразить их все и отфильтровать те, у которых нет типа, с помощью внешнего фильтра. Итак, то, что нельзя сделать с помощью одной только команды ip link, можно сделать, отфильтровав ее вывод с помощью соответствующего инструмента: jq используя ip -details -json link Выходные данные JSON для надежного синтаксического анализа. Есть jq документация, чтобы узнать, как ее использовать, справочная страница основана на ее содержимом.

Из полного списка интерфейсов необходимо сделать следующее:

  • исключить любой найденный тип (в выводе JSON это свойство info_kind свойства linkinfo, которое может быть все типа из справки (vlan, veth, ...), не путать с link_type который может быть например loopback , эфир, нет ...).
  • исключить замыкание на себя link_type.

что переводится как:

ip -details -json link show | jq -r '
.[] | 
      if .linkinfo.info_kind // .link_type == "loopback" then
          empty
      else
          .ifname
      end
'

Например, в этой системе с 12 интерфейсами в настоящее время только эти два, единственные два реальных, отображаются с помощью приведенной выше команды:

eth0
wlan0

Не стесняйтесь улучшить это jq фильтр.

Чтобы ответить на вопрос Q1, в этом случае замена ip ... link на ip ... address даст тот же результат. Но для отображения адресов в дополнение к интерфейсам, конечно, фильтр должен измениться (и требуется достаточно недавняя команда jq для пользовательской обработки перевода строки):

ip -details -json address show | jq --join-output '
.[] | 
      if .linkinfo.info_kind // .link_type == "loopback" then
          empty
      else
          .ifname ,
          ( ."addr_info"[] |
              if .family == "inet" or .family == "inet6" then
                  " " + .local
              else
                  empty
              end
          ),
          "\n"
      end
'

Если вы хотите проверить весь Вывод JSON напрямую, попробуйте ip -details -pretty -json address или ip -d -j address | jq. . Параметр -json доступен для нескольких команд iproute2, но не для всех. Его добавление для команд ip ... появилось совсем недавно (середина 2017 года).


Примечание: на самом деле ключевое слово type может переводиться в несколько различных типов свойств при использовании в JSON: .linkinfo.info_kind — это фактический тип интерфейса, описанный ранее, но есть также .linkinfo.info_slave_kind для интерфейса (включая реальный интерфейс), который имеет мост или соединение в качестве главного (соответственно bridge_slave и bond_slave). Это не изменит результаты JSON, поскольку не будет проверять это свойство.

В любом случае, такие интерфейсы никогда не должны иметь назначенный им IP-адрес: адрес должен быть установлен на мастер, который, несмотря на то, что он виртуальный, должен быть интерфейсом, который имеет значение при взаимодействии с окружающей физической средой.

2
ответ дан 30 May 2020 в 23:07

Теги

Похожие вопросы