Elencare solo i nomi dei dispositivi di tutte le interfacce di rete disponibili


21

Voglio ottenere un elenco di tutti i nomi di dispositivi di rete disponibili sul mio server Linux. Ho capito che

ifconfig

farebbe il lavoro, tuttavia ifconfig produce abbastanza output:

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

Quello che voglio ottenere è un elenco come

eth0
eth1
eth2
lo

o meglio ancora

eth0
eth1
eth2

Presumo che ciò possa essere fatto da una combinazione di "gatto", "sed" e "grep", ma semplicemente non ho idea di come eliminare le informazioni non necessarie.

Risposte:


17

Prova questo:

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

Questo ometterà lo:

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

Grazie dennis, ha funzionato come un fascino ^^. Perfekt. Le espressioni regolari sono davvero qualcosa che dovrei esaminare ^^
ftiaronsem,

Mi rendo conto che Linux e BSD contengono spesso *nixutility diverse , ma è un peccato che questa soluzione non funzioni su un Mac :(
blong

ifconfigè depresso, usa ipinvece
pstanton il

Questo sembra funzionare per OS X:ifconfig -a | sed -E 's/[[:space:]:].*//;/^$/d'
In pausa fino a ulteriore avviso.

22

Un'altra alternativa sarebbe:

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

O forse:

ls /sys/class/net

using ls /sys/class/netè una soluzione migliore negli /etc/local.dscript in openrc- le sedsoluzioni sopra finiscono con un extra :alla fine di ogni interfaccia quando vengono eseguite /etc/init.d/local(ma non quando lo script viene eseguito direttamente).
Stuart Cardall,

+1 per -o- non lo sapevo
Patryk il

16

Basta usare / sys / class / net e cancellare il percorso:

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

6

Prova questo:

ifconfig | cut -c 1-8 | sort | uniq -u
  • cut -c 1-8 estrae i primi 8 caratteri di ogni riga
  • sort ordina le linee
  • uniq -u stampa solo righe uniche che rimuoveranno le righe vuote per le righe descrittive che hanno solo spazi nei loro primi otto caratteri

Funziona su due macchine Linux che ho provato, ma sul mio MacBookPro (OS X 10.6.4), ifconfigutilizza le schede anziché gli spazi, quindi è un po 'più complicato:

ifconfig | expand | cut -c1-8 | sort | uniq -u | awk -F: '{print $1;}'
  • expand converte le schede in spazi
  • awk -F: '{print $1;}' stampa il primo campo prima dei due punti.

Grazie mille, soprattutto per la risposta molto dettagliata che spiega i parametri utilizzati. Se avrò un problema simile in futuro, so a quale post guardare ;-). Sfortunatamente non stava tagliando "lo", quindi la risposta accettata va a dennis. Ma questa è davvero una risposta molto utile, grazie :-)
ftiaronsem,

aggiungi | grep -v lo:-)
Doug Harris,

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

o se hai bisogno solo di eth *

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

3

Utilizzando il /sysfilesystem:

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

Utilizzando ip e Perl:

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

1

Ecco un modo per estrarre i nomi dell'interfaccia ifconfigdall'output:

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

Se si desidera escludere determinati nomi, un modo è di filtrare ulteriormente con grep:

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

Se si desidera escludere più nomi, aggiungerne altri -e fooal grepcomando.


La tua soluzione funziona altrettanto bene di quella di Dennis. Sfortunatamente non posso accettare due post, quindi Dennis è stato semplicemente più veloce. Ma grazie comunque, soprattutto per la tua spiegazione grep.
ftiaronsem,

1

per stampare la prima colonna:

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

puoi incorporare altre regole in awk per aggiungere o rimuovere voci, se necessario.

EDIT: lo stesso vale con ifconfig (come ha sottolineato Doug)

ifconfig | awk '{print $1}'

Questo è un esempio che esclude l'interfaccia 'lo'

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

Non funzionerà awkignorerà lo spazio bianco iniziale e stamperà anche la prima parola in ogni riga successiva.
Doug Harris,

Sfortunatamente, in effetti non funziona, a causa dell'esatto problema che Doug ha sottolineato. Ma grazie per il tuo aiuto, tuttavia apprezzo molto il tuo aiuto per un nuovo arrivato come me.
ftiaronsem,

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

fornisce

lo:
eth0:
eth1:
eth2:

come uscita


1

Anche se esiste una soluzione accettata, vorrei presentare la mia soluzione.

Ho un sacco di interfacce virtuali e vorrei ottenere un elenco, utilizzabile in vari script 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

Non mi interessa il loopback, perché so che è lì :)

Questo one-liner svolge il lavoro:

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

Produce un output come:

eth0
eth0:1
eth0:2
eth0:3

Godere.


1

Tutta la soluzione sopra funziona bene. Puoi ancora provare questo

ifconfig | grep HW | cut -c 1-6

Poiché, loche è loopback, non ha un indirizzo HW, non verrà visualizzato.

Produzione -

root @ glum: / home / amit # ifconfig | grep HW | taglio -c 1-6
enp7s0
vmnet1
vmnet8
wlp6s0

1

La soluzione più semplice è in ifconfig man (8)

man ifconfig (8) extract http://www.manpagez.com/man/8/ifconfig/ :

Il flag -l può essere usato per elencare tutte le interfacce disponibili sul sistema, senza altre informazioni aggiuntive. L'uso di questo flag si esclude a vicenda con tutti gli altri flag e comandi, ad eccezione di -d (elenca solo le interfacce inattive) e -u (elenca solo le interfacce che sono attive).

Quindi, per avere l'elenco, utilizzare:

ifconfig -l

I nomi saranno separati da uno spazio, quindi devi usare sed per sostituire questi spazi con un \ n:

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


1

migliorata:

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

1
Probabilmente dovresti farlo grep -v '^lo$'; il tuo comando corrente escluderà (esempio ipotetico) logicale ridiculousinterfacce.
Scott,

0

Nessuna delle soluzioni di cui sopra ha funzionato per me, ecco la mia soluzione:

ifconfig -a  | egrep "^[a-z]+" | sed "s/: .*//" | grep -v "lo"
  1. Elencare tutte le interfacce disponibili
  2. Estrai solo le righe che contengono i nomi dei dispositivi (nessuno spazio all'inizio)
  3. Rimuovere la parte finale non correlata che segue dal primo spazio
  4. Escludi lointerfaccia

Uscite:

eth0
eth0:1
wlan0

0

"ifcongif -l" dovrebbe fare il lavoro. il suo output è simile a "lo0 gif0 stf0 en0 ..." senza newline.

L'ho trovato su alcuni siti Web ma non riesco più a trovarlo. e sto ancora cercando il significato di quella bandiera "-l".


0

A volte nettools non è installato per impostazione predefinita. Quindi, mi piace usare i comandi integrati che hanno più di una garanzia da trovare all'interno di / bin, / usr / bin e / usr / sbin senza doversi preoccupare dei pacchetti post installati.

ip addr: mostra / manipola routing, dispositivi, policy routing e tunnel (indirizzo)
grep: trova uno spazio, quindi qualsiasi cosa dopo unitl:
cut: usa (:) come delimitatore e ottieni il campo 2
tr: elimina tutti gli spazi

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

0

Testato su macOS, ha funzionato come segue. Avevo bisogno di trovare tutte le interfacce che erano UP. Questo si basa sulla risposta di Dennis Williamson sopra.

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


-1

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


1
Potresti per favore espandere e spiegare cosa fa questo? Le risposte a una riga non sono generalmente un buon formato per Superuser.
Doktoro Reichard,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.