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

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

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

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

Я пытался (безуспешно) получить ту же информацию, используя ip address show type XXX. В соответствии с ip address help возможные типы:

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 address показать только физические интерфейсы? Например, чтобы увидеть локальные IP-адреса машины.

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

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

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

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

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

  • исключить любой найденный тип (в выводе JSON это info_kind собственность linkinfo, которые могут быть любого типа из справки (влан, veth, ...), не путать с link_type который может быть например петля, эфир, никто ...).
  • исключить петлю 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-адрес: адрес должен быть установлен на мастер, который, несмотря на то, что он виртуальный, должен быть интерфейсом, который имеет значение при взаимодействии с окружающей физической средой.