Wyświetl tylko nazwy urządzeń wszystkich dostępnych interfejsów sieciowych

18

Chcę uzyskać listę wszystkich dostępnych nazw urządzeń sieciowych na moim serwerze Linux. zauważyłem to

ifconfig

wykona zadanie, jednak ifconfig generuje dość dużo danych wyjściowych:

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  
          [...]

Chcę osiągnąć taką listę

eth0
eth1
eth2
lo

lub nawet lepiej

eth0
eth1
eth2

Zakładam, że można to zrobić za pomocą kombinacji „cat”, „sed” i „grep”, ale po prostu nie mam pojęcia, jak usunąć niepotrzebne informacje.

ftiaronsem
źródło

Odpowiedzi:

16

Spróbuj:

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

To pominie lo:

ifconfig -a | sed 's/[ \t].*//;/^\(lo\|\)$/d'
Dennis Williamson
źródło
Dzięki dennis, to działało jak urok ^^. Perfekt. Wyrażenia regularne to naprawdę coś, w co powinienem spojrzeć ^^
ftiaronsem
Zdaję sobie sprawę, że Linux i BSD często zawierają inne *nix narzędzia, ale to niefortunne to rozwiązanie nie działa na Macu :(
blong
ifconfig jest przestarzałe, użyj ip zamiast
pstanton
Wydaje się, że działa to dla OS X: ifconfig -a | sed -E 's/[[:space:]:].*//;/^$/d'
Dennis Williamson
19

Inną alternatywą byłoby:

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

Albo może:

ls /sys/class/net
jweyrich
źródło
za pomocą ls /sys/class/net jest lepszym rozwiązaniem w /etc/local.d skrypty w openrc - sed powyższe rozwiązania kończą się dodatkiem : na końcu każdego interfejsu podczas uruchamiania /etc/init.d/local (ale nie wtedy, gdy skrypt jest uruchamiany bezpośrednio).
Stuart Cardall
+1 dla -o - nie wiedziałem o tym
Patryk
15

Po prostu użyj / sys / class / net i usuń ścieżkę:

$ basename -a /sys/class/net/*
eth0
eth1
lo
ppp0
tun0
Matteo Croce
źródło
5

Spróbuj tego:

ifconfig | cut -c 1-8 | sort | uniq -u
  • cut -c 1-8 wyodrębnia pierwszych 8 znaków z każdej linii
  • sort sortuje linie
  • uniq -u wypisuje tylko unikalne linie, które usuwają puste linie w liniach opisu, które mają tylko spacje w pierwszych ośmiu znakach

Działa to na dwóch komputerach z Linuksem, które próbowałem, ale na moim MacBookPro (OS X 10.6.4), ifconfig używa kart zamiast spacji, więc jest nieco bardziej skomplikowane:

ifconfig | expand | cut -c1-8 | sort | uniq -u | awk -F: '{print $1;}'
  • expand konwertuje karty na spacje
  • awk -F: '{print $1;}' wypisuje pierwsze pole przed dwukropkiem.
Doug Harris
źródło
Dziękuję bardzo, szczególnie za bardzo szczegółową odpowiedź wyjaśniającą zastosowane parametry. Jeśli będę miał podobny problem w przyszłości, wiem, na który post patrzeć ;-). Niestety nie wycinano „lo”, więc zaakceptowana odpowiedź trafia do dennisa. Ale to naprawdę bardzo przydatna odpowiedź, dziękuję :-)
ftiaronsem
Dodaj | grep -v lo :-)
Doug Harris
4
ls /sys/class/net/
eth0  eth1  eth2  lo

lub jeśli potrzebujesz tylko eth *

ls /sys/class/net/eth*
eth0
eth1
eth2
wWolfovich
źródło
3

Za pomocą /sys system plików:

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

Korzystanie z IP i Perla:

ip -o l|perl -lane'$F[1]=~s/://g;print $F[1]'
someguy
źródło
1

Oto jeden ze sposobów wyodrębnienia nazw interfejsów z ifconfig wydajność:

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

Jeśli chcesz wykluczyć pewne nazwy, możesz filtrować jeden sposób grep:

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

Jeśli chcesz wykluczyć więcej nazw, dodaj więcej -e foo do grep dowództwo.

Gilles
źródło
Twoje rozwiązanie działa równie dobrze jak dennis. Niestety nie mogę zaakceptować dwóch postów, więc dennis był po prostu szybszy. Ale mimo wszystko dziękuję, zwłaszcza za wyjaśnienie grep.
ftiaronsem
1

po prostu wydrukować pierwszą kolumnę:

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

możesz włączyć inne reguły w awk, aby dodawać lub usuwać wpisy w razie potrzeby.

EDYCJA: to samo dotyczy ifconfig (jak wskazał Doug)

ifconfig | awk '{print $1}'

Oto przykład wykluczający interfejs „lo”

ifconfig | awk '{if ($1 != lo) print $1}'
MaQleod
źródło
To nie zadziała. awk zignoruje wiodącą białą spację i wydrukuje pierwsze słowo w każdej kolejnej linii.
Doug Harris
Niestety, to naprawdę nie działa, cierpiąc dokładnie na problem, który wskazał Doug. Ale dzięki za pomoc, naprawdę doceniam to, że pomagasz nowicjuszowi jak ja.
ftiaronsem
1
/usr/sbin/ip addr show | awk '/^[1-9]/ {print $2}'

zapewnia

lo:
eth0:
eth1:
eth2:

jako wyjście

Promod
źródło
1

Mimo że istnieje zaakceptowane rozwiązanie, chciałbym przedstawić moje rozwiązanie tego.

Mam kilka wirtualnych interfejsów i chciałbym dostać listę, użyteczny w różnych skryptach 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

Nie interesuje mnie pętla zwrotna, ponieważ wiem, że tam jest :)

Ten jeden liner wykonuje zadanie:

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

Tworzy wyjście takie jak:

eth0
eth0:1
eth0:2
eth0:3

Cieszyć się.

Mogens TrasherDK
źródło
1

Wszystkie powyższe rozwiązania działają poprawnie. Nadal możesz spróbować

ifconfig | grep HW | cut -c 1-6

Od, lo która jest pętlą zwrotną, nie ma przypisanego adresu sprzętowego, nie pojawi się.

Wyjście -

root@glum:/home/amit# ifconfig | grep HW | cut -c 1-6
enp7s0
vmnet1
vmnet8
wlp6s0
C0deDaedalus
źródło
1

Najprostszym rozwiązaniem jest man ifconfig (8)

Wyciąg man ifconfig (8) http://www.manpagez.com/man/8/ifconfig/ :

Flaga -l może być użyta do wyświetlenia wszystkich dostępnych interfejsów na   system, bez żadnych dodatkowych informacji. Używanie tej flagi to   wzajemnie wykluczające się ze wszystkimi innymi flagami i poleceniami, z wyjątkiem -d   (tylko interfejsy listy, które są wyłączone) i -u (tylko lista łączy to   są w górze).

Aby mieć listę, użyj:

ifconfig -l

Nazwy zostaną oddzielone spacją, więc musisz użyć sed, aby zastąpić te spacje n:

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

Syberam
źródło
1

Ulepszony:

netstat -i | grep '^[a-z]' | awk '{print $1}' | grep -v 'lo'
Bob Smith
źródło
1
Powinieneś to zrobić grep -v '^lo$'; Twoje obecne polecenie wyklucza (przykład hipotetyczny) logical i ridiculous interfejsy.
Scott
0

Żadne z powyższych rozwiązań nie zadziałało dla mnie, oto moje rozwiązanie:

ifconfig -a  | egrep "^[a-z]+" | sed "s/: .*//" | grep -v "lo"
  1. Wyświetl wszystkie dostępne interfejsy
  2. Wyodrębnij tylko linie zawierające nazwy urządzeń (brak spacji na początku)
  3. Usuń niepowiązaną część spływu, która jest z pierwszego miejsca
  4. Wykluczać lo berło

Wyjścia:

eth0
eth0:1
wlan0
ceremcem
źródło
-1

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

ttbakiatwoam
źródło
1
Czy możesz rozwinąć koniec wyjaśnić, co to robi? Odpowiedzi jednej linii nie są na ogół dobrym formatem dla superużytkownika.
Doktoro Reichard