Перелічіть лише назви пристроїв усіх доступних мережевих інтерфейсів


21

Я хочу отримати список усіх доступних імен мережевих пристроїв на моєму сервері Linux. Я зрозумів це

ifconfig

зробить цю роботу, однак, якщоconfig дає досить великий вихід:

eth0      Link encap:Ethernet  Hardware Adresse 08:00:27:fc:5c:98  
          inet Adresse:192.168.2.222  Bcast:192.168.2.255  Maske:255.255.255.0
          inet6-Adresse: fe80::a00:27ff:fefc:5c98/64 Gültigkeitsbereich:Verbindung
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metrik:1
          RX packets:329 errors:0 dropped:0 overruns:0 frame:0
          TX packets:177 errors:0 dropped:0 overruns:0 carrier:0
          Kollisionen:0 Sendewarteschlangenlänge:1000 
          RX bytes:41496 (40.5 KiB)  TX bytes:32503 (31.7 KiB)

eth1      Link encap:Ethernet  Hardware Adresse 08:00:27:e9:35:7d  
          [...]

eth2      Link encap:Ethernet  Hardware Adresse 08:00:27:ff:db:fe  
          [...]

lo        Link encap:Lokale Schleife  
          [...]

Я хочу досягти такого списку

eth0
eth1
eth2
lo

а ще краще просто

eth0
eth1
eth2

Я припускаю, що це можна зробити за допомогою комбінації «кішка», «sed» та «grep», але я просто не маю поняття, як позбавити непотрібну інформацію.

Відповіді:


17

Спробуйте:

ifconfig -a | sed 's/[ \t].*//;/^$/d'

Це опустить lo:

ifconfig -a | sed 's/[ \t].*//;/^\(lo\|\)$/d'

Спасибі dennis, це спрацювало як шарм ^^. Perfekt. Регулярні вирази - це дійсно те, що мені слід заглянути в ^^
ftiaronsem

Я усвідомлюю, що Linux і BSD часто містять різні *nixутиліти, але шкода, що це рішення не працює на Mac :(
blong

ifconfigзастаріло, використовуйте ipнатомість
pstanton

Здається, це працює для OS X:ifconfig -a | sed -E 's/[[:space:]:].*//;/^$/d'
Призупинено до подальшого повідомлення.

22

Ще одна альтернатива:

ip -o link show | awk -F': ' '{print $2}'

Або можливо:

ls /sys/class/net

використання ls /sys/class/netє кращим рішенням у /etc/local.dсценаріях в openrc- sedрішення вище закінчуються додатковими :в кінці кожного інтерфейсу при запуску з /etc/init.d/local(але не тоді, коли сценарій запускається безпосередньо).
Стюарт Кардалл

+1 за -o- не знав цього
Патрик

16

Просто використовуйте / sys / class / net і викресліть шлях:

$ basename -a /sys/class/net/*
eth0
eth1
lo
ppp0
tun0

6

Спробуйте це:

ifconfig | cut -c 1-8 | sort | uniq -u
  • cut -c 1-8 витягує перші 8 символів кожного рядка
  • sort сортує лінії
  • uniq -u друкує лише унікальні рядки, які видалять порожні рядки для рядків опису, які мають лише пробіли у перших восьми символах

Це працює на двох машинах Linux, які я спробував, але на моєму MacBookPro (OS X 10.6.4) ifconfigвикористовує вкладки замість пробілів, тому це трохи складніше:

ifconfig | expand | cut -c1-8 | sort | uniq -u | awk -F: '{print $1;}'
  • expand перетворює вкладки в пробіли
  • awk -F: '{print $1;}' друкує перше поле перед двокрапкою.

Дуже дякую, особливо за дуже детальну відповідь, що пояснює використані параметри. Якщо у мене виникне подібне питання у майбутньому, я знаю, на яку посаду шукати ;-). На жаль, це не було різання "ло", тому прийнята відповідь йде до dennis. Але це справді дуже корисна відповідь, дякую :-)
ftiaronsem

додати | grep -v lo:-)
Doug Harris


3

Використання /sysфайлової системи:

basename -a $(ls /sys/devices/**/net/* -d)

Використання ip та Perl:

ip -o l|perl -lane'$F[1]=~s/://g;print $F[1]'

1

Ось один із способів вилучення імен інтерфейсу з ifconfigвиводу:

ifconfig -a | sed -n 's/^\([^ ]\+\).*/\1/p'

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

ifconfig -a | sed -n 's/^\([^ ]\+\).*/\1/p' | grep -Fvx -e lo

Якщо ви хочете виключити більше імен, додайте більше -e fooдо grepкоманди.


Ваше рішення працює так само добре, як і деніс. На жаль, я не можу прийняти дві посади, тому dennis був просто швидше. Але все-таки спасибі, особливо за ваше щире пояснення.
ftiaronsem

1

просто надрукувати перший стовпець:

netstat -a | awk '{print $1}'

ви можете включити інші правила, щоб додавати або видаляти записи, якщо потрібно.

EDIT: те саме стосується ifconfig (як зазначив Даг)

ifconfig | awk '{print $1}'

Це приклад, що виключає інтерфейс 'lo'

ifconfig | awk '{if ($1 != lo) print $1}'

Це не спрацює. awkігнорує провідний пробіл та друкує перше слово також у кожному наступному рядку.
Doug Harris

На жаль, це справді не працює, страждаючи саме на те, на що вказував Дуг. Але дякую за вашу допомогу, проте я дуже вдячний, що ви допомагаєте новому, як я.
ftiaronsem

1
/usr/sbin/ip addr show | awk '/^[1-9]/ {print $2}'

забезпечує

lo:
eth0:
eth1:
eth2:

як вихід


1

Хоча прийняте рішення існує, я хотів би представити своє рішення щодо цього.

У мене є купа віртуальних інтерфейсів, і я хотів би отримати список, який можна використовувати в різних скриптах bash.

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 11.22.33.137  netmask 255.255.255.192  broadcast 11.22.33.191
        inet6 fe80::a00:27ff:fe8c:6bd3  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:8c:6b:d3  txqueuelen 1000  (Ethernet)
        RX packets 2969136  bytes 2394432908 (2.2 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1378821  bytes 358960701 (342.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 11.22.33.189  netmask 255.255.255.192  broadcast 11.22.33.191
        ether 08:00:27:8c:6b:d3  txqueuelen 1000  (Ethernet)

eth0:2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 11.22.33.190  netmask 255.255.255.192  broadcast 11.22.33.191
        ether 08:00:27:8c:6b:d3  txqueuelen 1000  (Ethernet)

eth0:3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 11.22.33.180  netmask 255.255.255.192  broadcast 11.22.33.191
        ether 08:00:27:8c:6b:d3  txqueuelen 1000  (Ethernet)

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 673768  bytes 277972236 (265.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 673768  bytes 277972236 (265.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Мене не цікавить петля, оскільки я знаю, що вона є :)

Цей однокласник виконує завдання:

ifconfig | egrep '^eth' | cut -f 1-2 -d ':' | cut -f 1 -d ' '| pcregrep -o1 "(((eth\d)(:\d))|(eth\d))"

Виходить такий результат:

eth0
eth0:1
eth0:2
eth0:3

Насолоджуйтесь.


1

Все вищезазначене рішення працює чудово. Ти все ж можеш спробувати це

ifconfig | grep HW | cut -c 1-6

Оскільки, loякий є циклічним, не призначено HW-адресу, вона не відображатиметься.

Вихід -

root @ темно: / home / amit # ifconfig | греп HW | вирізати -c 1-6
enp7s0
vmnet1
vmnet8
wlp6s0

1

Найпростіше рішення у людині, якщоконфігурувати (8)

man ifconfig (8) витяг http://www.manpagez.com/man/8/ifconfig/ :

Прапор -l може використовуватися для списку всіх доступних інтерфейсів у системі, без іншої додаткової інформації. Використання цього прапора взаємовиключне з усіма іншими прапорами та командами, за винятком -d (лише інтерфейси списку, які вниз) і -u (лише інтерфейси списку, що знаходяться вгорі).

Отже, щоб мати список, використовуйте:

ifconfig -l

Імена будуть розділені пробілом, тому вам доведеться використовувати sed для заміни цих пробілів на \ n:

ifconfig -l | sed 's/ / /g'


1

Поліпшено:

netstat -i | grep '^[a-z]' | awk '{print $1}' | grep -v 'lo'

1
Ви, мабуть, повинні це зробити grep -v '^lo$'; Ваша поточна команда буде виключати (гіпотетичний приклад) logicalта ridiculousінтерфейси.
Скотт

0

Жодне з перерахованих вище рішень не працювало для мене, ось моє рішення:

ifconfig -a  | egrep "^[a-z]+" | sed "s/: .*//" | grep -v "lo"
  1. Список усіх доступних інтерфейсів
  2. Витягуйте лише рядки, що містять назви пристроїв (на початку немає місця)
  3. Видаліть непов’язану кінцеву частину, яка є після першого пробілу
  4. Виключити loінтерфейс

Виходи:

eth0
eth0:1
wlan0

0

"ifcongif -l" повинен виконати цю роботу. його вихід такий "lo0 gif0 stf0 en0 ..." без нового рядка.

Я знайшов його на якомусь веб-сайті, але більше не можу його знайти. і я все ще шукаю значення цього прапора "-l".


0

Іноді nettools не встановлено за замовчуванням. Отже, мені подобається використовувати вбудовані команди, які мають більше гарантій, що їх можна знайти в / bin, / usr / bin та / usr / sbin, не турбуючись про встановлені пакети.

ip addr: показати / маніпулювати маршрутизацією, пристроями, маршрутизацією політики та тунелями (адреса)
grep: знайти пробіл, а потім що-небудь після unitl:
cut: використовувати (:) як роздільник та отримати поле 2
tr: видалити будь-які пробіли

$ ip addr | grep -E ': \ s. * ?:' | вирізати -d ":" -f 2 | tr -d ""

0

Тестовано на macOS, працювало наступне. Мені потрібно було знайти всі інтерфейси, які були UP. Це ґрунтується на відповіді Денніса Вільямсона вище.

ifconfig -a | grep UP | sed 's/:.*//;/^$/d'


-1

ifconfig | grep flags | awk -F: '{print $1;}'


1
Чи можете ви, будь ласка, розгорнути кінець, пояснити, що це робить? Відповіді в одному рядку, як правило, не є хорошим форматом для Суперрузера.
Докторо Рейхард
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.