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


21

Я хочу получить список всех доступных имен сетевых устройств на моем сервере Linux. Я понял, что

ifconfig

сделает эту работу, однако ifconfig выдает довольно много:

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

Я предполагаю, что это может быть сделано с помощью комбинации «cat», «sed» и «grep», но я просто не имею ни малейшего понятия о том, как убрать ненужную информацию.

Ответы:


17

Попробуйте это:

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

Это пропустит lo:

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

Спасибо Деннис, это сработало как шарм ^^. 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;}' печатает первое поле перед двоеточием.

Большое спасибо, особенно за очень подробный ответ, объясняющий используемые параметры. Если у меня будет похожая проблема в будущем, я знаю, какой пост посмотреть ;-). К сожалению, это не было сокращением "вот", поэтому принятый ответ идет к Денису. Но это действительно очень полезный ответ, спасибо :-)
ftiaronsem 26.10.10

добавить | grep -v lo:-)
Даг Харрис

4
ls /sys/class/net/
eth0  eth1  eth2  lo

или если вам нужен только эти *

ls /sys/class/net/eth*
eth0
eth1
eth2

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команду.


Ваше решение работает так же хорошо, как решение Дениса. К сожалению, я не могу принять два поста, поэтому Денис был просто быстрее. Но, тем не менее, спасибо, особенно за ваше объяснение grep.
ftiaronsem 26.10.10

1

просто напечатать первый столбец:

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

Вы можете включить другие правила в awk, чтобы добавлять или удалять записи по мере необходимости.

РЕДАКТИРОВАТЬ: то же самое идет с ifconfig (как указал Дуг)

ifconfig | awk '{print $1}'

Это пример, исключающий интерфейс 'lo'

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

Это не сработает. awkбудет игнорировать начальный пробел и печатать первое слово в каждой последующей строке.
Даг Харрис

К сожалению, это действительно не работает, страдая от точного вопроса, на который указал Дуг. Но спасибо за вашу помощь, тем не менее, я очень ценю, что вы помогаете новичку, как я.
ftiaronsem 26.10.10

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 @ glum: / home / amit # ifconfig | grep HW | Cut -C 1-6
enp7s0
VMnet1
VMnet8
wlp6s0

1

Самое простое решение в человеке ifconfig (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: use (:) в качестве разделителя и получить поле 2
tr: удалить любые пробелы

$ ip addr | grep -E ': \ s. * ?:' | cut -d ":" -f 2 | tr-d ""

0

Проверено на macOS, сработало следующее. Мне нужно было найти все интерфейсы, которые были UP. Это основано на ответе Денниса Уильямсона выше.

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


-1

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


1
Не могли бы вы расширить и объяснить, что это делает? Ответы в одну строку, как правило, не подходят для Superuser.
Доктор Рейхард
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.