Как получить только имя физический интерфейс Ethernet?

Поскольку обе они Linux, может быть, вы можете настроить все так, чтобы любая ОС могла возобновить работу с изображений, сохраненных любой ОС? Если образ гибернации включает всю память ядра, включая код, то не имеет значения, какое ядро ​​возобновит работу из него. Я не знаю, как это работает.

Кроме того, возможно, если ваш ноутбук поддерживает гибернацию ACPI, Linux сможет переходить в спящий режим таким образом. Тогда, надеюсь, он всегда возобновляется при включении, а не при загрузке в GRUB? Опять же, не знаю, как все работает.

Возможно, вам удастся настроить операционные системы так, чтобы они не использовали раздел подкачки, если в нем был образ резюме. Это не поможет, если они оба монтируют одни и те же разделы без подкачки для чтения и записи. Может быть, есть опция монтирования, чтобы отказаться от повтора журнала (что испортит состояние гибернации).


Если ничего из этого не сработает, я думаю, ваше решение - лучшее, что вы собираетесь получить. Я не думаю, что grub знает, как посмотреть на раздел подкачки и выяснить, используется ли он. Если бы это было возможно, то, возможно, у вас была бы какая-то логика в вашей конфигурации grub, чтобы разрешить загрузку только записи SAVEDEFAULT. (На самом деле маловероятно, что grub сможет выяснить какая ОС имеет образ гибернации, без использования SAVEDEFAULT.)

ссылки:

3
22.03.2018, 09:21
6 ответов

Это даст вам имя одного физического устройства. Я думаю, что awk не будет работать правильно для нескольких устройств. Однако снимите awk, и вы получите список всех физических имен.

lshw -class network | grep -A 1 "bus info" | grep name | awk -F': ' '{print $2}'

2
27.01.2020, 21:11

Вы можете указать, какие интерфейсы являются виртуальными, с помощью

ls -l /sys/class/net/

, который дает вам этот вывод:

[root@centos7 ~]# ls -l /sys/class/net/
total 0
lrwxrwxrwx. 1 root root 0 Mar 20 08:58 ens33 ->../../devices/pci0000:00/0000:00:11.0/0000:02:01.0/net/ens33
lrwxrwxrwx. 1 root root 0 Mar 20 08:58 lo ->../../devices/virtual/net/lo
lrwxrwxrwx. 1 root root 0 Mar 20 08:58 virbr0 ->../../devices/virtual/net/virbr0
lrwxrwxrwx. 1 root root 0 Mar 20 08:58 virbr0-nic ->../../devices/virtual/net/virbr0-nic

Оттуда вы можете grep фильтровать только не -виртуальные интерфейсы:

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

Другим вариантом является использование этого небольшого скрипта, адаптированного из этого ответа , который печатает имена всех интерфейсов, у которых нет MAC-адреса 00 :00 :00 :00 :00 :00 т.е. физический:

#!/bin/bash

for i in $(ip -o link show | awk -F': ' '{print $2}')
do
    mac=$(ethtool -P $i)
    [[ $mac != *"00:00:00:00:00:00"* ]] && echo "$i"
done
10
27.01.2020, 21:11

Нам нужен «чистый список интерфейсов», в котором нет петли.

Я придумал два способа, которые мне показались «хорошими».

find /sys/class/net -type l -execdir basename '{}' ';' | grep -v "^lo$"

(объяснение :найти все фактические устройства, для которых udev сделал символическую ссылку, и получить «базовое имя», которое является именем файла и именем интерфейса | избавиться от любой строки, которая точно соответствует "lo")

!!! не используйте «ls» в скриптах bash

И

arp | awk '{ if ( NR > 1  ) { print } }' | awk '{print $5}' | sed '/^$/d'| sort -u

(объяснение :дай мне информацию о таблице arp | не печатать, если строка 1, которая является заголовком таблицы arp | печатать только пятую колонку | удалить пустые строки | афавитизировать и удалять дубликаты)

С помощью команды arp вы можете указать устройства Ethernet.

arp -t ether

Я не уверен, избавится ли это от "виртуальных устройств". Он наверняка включает в себя мой сетевой интерфейс Wi-Fi. Имея «чистый список» имен, вы можете подключить их к большинству других команд и проверить MAC-адрес на наличие нулей или виртуального атрибута...

Я видел много ответов, анализирующих "ls". На самом деле не следует этого делать. Скорее всего, сетевые интерфейсы не названы таким образом, чтобы ломать вещи обычным способом (, то есть пробелами, символами новой строки, другими странными символами... ). Кроме того, find, arp, awk, sed и sort, как правило, уже есть на каждом устройстве Linux.

Я тестировал свои команды только на своем ноутбуке Kubuntu. Мне так никто не платит, это все, на что у меня сегодня есть время. Мне также нужно было получить имя моих сетевых интерфейсов, и я буду использовать arp-интерфейс на своих экземплярах, которые не знают свое единственное сетевое устройство, а все их существование полностью абстрагировано.

0
12.03.2021, 18:06

Я использовал следующее, чтобы получить его в python.

#!/usr/bin/env python3
from os import listdir
from os.path import islink, realpath, join

interfaces = [i for i in listdir("/sys/class/net") if islink(join("/sys/class/net", i))]
interfaces = [i for i in interfaces if not realpath(join("/sys/class/net", i)).startswith(("/sys/devices/virtual", "/sys/devices/vif"))]

print("Physical interfaces:", interfaces)

В моем случае печатает следующее:

Physical interfaces: ['enp3s0']

Обратите внимание, что виртуальные сетевые устройства не всегда находятся по пути «/sys/devices/virtual». Например, на узлах Xen также есть такие устройства, как «devices/vif -1 -0/net/vif1.0», поэтому я их тоже исключил.

0
13.10.2021, 15:06

Вы также можете использовать ниже, чтобы получить физический интерфейс.

ip r | grep default | awk '/default/ {print $5}'

Он в основном извлекает имя интерфейса из вывода route show.

0
13.10.2021, 16:09

Вдохновленный существующим ответом , который называет полезный /sys/class/netкаталог и предупреждение не использовать ls и мне нужно видеть только имя, а не окружающий материал, я придумал следующую единственную команду:

find /sys/class/net -mindepth 1 -maxdepth 1 -lname '*virtual*' -prune -o -printf '%f\n'

Это дает вам список всех не--loopback и не--виртуальных интерфейсов:

$ find /sys/class/net -mindepth 1 -maxdepth 1 -lname '*virtual*' -prune -o -printf '%f\n'
eth1
eth0
2
17.11.2021, 17:55

Теги

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