Использование 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
документация чтобы узнать, как его использовать, справочная страница основана на ее содержимом.
Из полного списка интерфейсов это необходимо сделать:
что переводится как:
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-адрес: адрес должен быть установлен на мастер, который, несмотря на то, что он виртуальный, должен быть интерфейсом, который имеет значение при взаимодействии с окружающей физической средой.