Получить список имен устройств Ethernet в сценарии Bash

Я пытаюсь создать сценарий bash, который создает массив имен устройств Ethernet на моем ПК, а не на беспроводной карте. Я хочу иметь список имен, чтобы позже перебирать их.

Например, предположим, что у меня есть два сетевых адаптера Ethernet — enp2s0 и enp3s0 и беспроводная карта — wlp4s0.

От lscpi я бы посмотрел

02:00.0 Ethernet controller: <truncated>
03:00.0 Ethernet controller: <truncated>
04:00.0 Network controller: Intel Corporation Wireless 

Аналогично ip a показывает

1: lo: <truncated>
2: enp2s0: <truncated>
3: enp3s0: <truncated>
4: wlp4s0: <truncated>

Как я могу создать массив имен, чтобы я мог перебирать их?
enp2s0 enp3s0

Я понял, как найти первую сетевую карту, используя

NIC=$(basename $(udevadm info -e | grep "DEVPATH=.*$(lspci | grep -m 1  Ethernet | cut -f 1 -d\ )/net" | cut -f 2 -d\ ))

Но я не могу понять, как зациклить этот подход. Любые предложения, как я могу сделать это в bash?

Спасибо

Денша

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 559
4

Ответы 4

for f in $(ip a | grep enp | awk '{print $2}' | cut -d":" -f1)
do 
  <something with $f>
done

Для устройств, которые не начинаются с «enp», альтернатива приведена ниже:

for f in $(ip a | grep -B1 "ether" | grep -v ether | awk '{print $2}' | cut -d":" -f1)
do 
  <something with $f>
done

Извините, я забыл упомянуть, что хочу работать на системах с разными именами устройств, а не на всех enp*.

densha 19.02.2019 09:45

nmcli имеет вывод, который можно легко проанализировать, но вам, возможно, придется сначала его установить.

Пример вывода nmcli device:

DEVICE  TYPE      STATE        CONNECTION       
eno1    ethernet  connected    wired connection 
wlp2s0  wifi      unavailable  --               
lo      loopback  unmanaged    --

Чтобы извлечь только имена устройств Ethernet, используйте

nmcli device | awk '$2= = "ethernet" {print $1}'

В этом примере вывод будет eno1. Вы можете использовать команду в цикле, как обычно:

for device in $(nmcli device | awk '$2= = "ethernet" {print $1}'); do
    # stuff
done

Спасибо с предложениями, которые я изменил свой оригинал на

for DEV in $(lspci | grep   Ethernet | cut -f 1 -d\ )
do
  NIC=$(basename $(udevadm info -e | grep "DEVPATH=.*$DEV/net" | cut -f 2 -d\ ))
  echo $NIC
done

Спасибо за предложения

Попробуйте time udevadm info -e | grep "DEVPATH=.*$DEV/net/" и time ip l | sed 's/^ *[0-9]\+: \([^ ]\+\):.*/\1/p;d' сравнить!

F. Hauri 19.02.2019 10:43

Но если вы предпочитаете команду рядом с ядром, U может: /bin/ls /sys/class/net/

F. Hauri 19.02.2019 10:56

Сетевые устройства

Последний дистрибутив Linux использует набор iproute2 для управления сетями.

Основная команда для вывода списка устройств — ip link show, которую можно сократить до ip l.

Вы могли:

ip l | sed 's/^ *[0-9]\+: \([^ ]\+\):.*/\1/p;d'

может вернуться:

lo
eth0

Объяснение:

типичный вывод ip l (можно записать: ip links show) выглядит так:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether b8:27:eb:5f:b0:eb brd ff:ff:ff:ff:ff:ff

sed команда будет,

  • заменить (s///)
  • в строке, начинающейся с 0 или более пробелов (*)
  • за которым следует число, двоеточие и пробел ([0-9]\+:)
  • шаблон любого не-пространства (\([^ ]\+\))
  • за которым следует двоеточие и остальная часть строки
  • по строке, соответствующей шаблону, (/\1/)
  • затем напечатайте полученную строку (p)
  • и брось все остальное ;d

Альтернатива :

Чтобы сделать что-то с $iface в цикле, вы можете написать:

shopt -s extglob
while IFS=$' :\t\r\n' read num iface line;do
    if [ "$num" ] && [ -z "${num//*([0-9])}" ] && [ "$iface" ] ;then
        echo Doing something with $iface
    fi
done < <(ip l)

...

Doing something with lo
Doing something with eth0

с IP-адресом

Этот небольшой цикл напечатает 1 строку для каждого IPv4-адреса каждого интерфейса. (неиспользуемый или ненастроенный интерфейс отображаться не будет):

while IFS=$' :\t\r\n' read p1 p2 line ;do
    [ "$p1" ] && {
        [ -z "${p1//*([0-9])}" ] && [ "$p2" ] && crtif=$p2
        if [ -z "${p1/inet}" ] ;then
            echo Doing something with $crtif having ip $p2
        fi
     }
done < <(ip a)

Doing something with lo having ip 127.0.0.1/8
Doing something with eth0 having ip 192.168.1.35/24

Другие вопросы по теме