Enumere solo los nombres de dispositivo de todas las interfaces de red disponibles

21

Quiero obtener una lista de todos los nombres de dispositivos de red disponibles en mi servidor Linux. Lo imaginé

ifconfig

haría el trabajo, sin embargo, ifconfig produce bastante salida:

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

Lo que quiero lograr es una lista como

eth0
eth1
eth2
lo

o incluso mejor solo

eth0
eth1
eth2

Supongo que esto se puede hacer mediante una combinación de "gato", "sed" y "grep", pero simplemente no tengo idea de cómo quitar la información innecesaria.

ftiaronsem
fuente

Respuestas:

17

Prueba esto:

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

Esto omitirá lo:

ifconfig -a | sed 's/[ \t].*//;/^\(lo\|\)$/d'
Pausado hasta nuevo aviso.
fuente
Gracias Dennis, esto funcionó a las mil maravillas ^^. Perfekt. Las expresiones regulares son realmente algo que debería considerar ^^
ftiaronsem
Me doy cuenta de que Linux y BSD a menudo contienen diferentes *nixutilidades, pero es lamentable que esta solución no funcione en una Mac :(
blong
ifconfigestá en desuso, úselo en su iplugar
pstanton
Esto parece funcionar para OS X:ifconfig -a | sed -E 's/[[:space:]:].*//;/^$/d'
pausa hasta nuevo aviso.
22

Otra alternativa sería:

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

O tal vez:

ls /sys/class/net
jweyrich
fuente
usar ls /sys/class/netes una mejor solución en /etc/local.dscripts en openrc- las sedsoluciones anteriores terminan con un extra :al final de cada interfaz cuando se ejecutan desde /etc/init.d/local(pero no cuando el script se ejecuta directamente).
Stuart Cardall el
+1 para -o- no sabía eso
Patryk
16

Simplemente use / sys / class / net y elimine el camino:

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

Prueba esto:

ifconfig | cut -c 1-8 | sort | uniq -u
  • cut -c 1-8 extrae los primeros 8 caracteres de cada línea
  • sort ordena las líneas
  • uniq -u imprime solo líneas únicas que eliminarán las líneas en blanco de las líneas descriptivas que solo tienen espacios en sus primeros ocho caracteres

Esto funcionó en dos máquinas Linux que probé, pero en mi MacBookPro (OS X 10.6.4), ifconfigusa pestañas en lugar de espacios, por lo que es un poco más complicado:

ifconfig | expand | cut -c1-8 | sort | uniq -u | awk -F: '{print $1;}'
  • expand convierte pestañas en espacios
  • awk -F: '{print $1;}' imprime el primer campo antes de los dos puntos.
Doug Harris
fuente
Muchas gracias, especialmente por la respuesta muy detallada que explica los parámetros utilizados. Si voy a tener un problema similar en el futuro, sé en qué publicación mirar ;-). Desafortunadamente no estaba cortando "lo", por lo que la respuesta aceptada va a Dennis. Pero esta es realmente una respuesta muy útil, gracias :-)
ftiaronsem
add | grep -v lo:-)
Doug Harris
4
ls /sys/class/net/
eth0  eth1  eth2  lo

o si solo necesitas eth *

ls /sys/class/net/eth*
eth0
eth1
eth2
wWolfovich
fuente
3

Usando el /syssistema de archivos:

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

Usando ip y Perl:

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

Aquí hay una forma de extraer los nombres de interfaz de la ifconfigsalida:

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

Si desea excluir ciertos nombres, una forma es filtrar aún más con grep:

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

Si desea excluir más nombres, agregue más -e fooal grepcomando.

Gilles 'SO- deja de ser malvado'
fuente
Su solución funciona igual de bien que la de Dennis. Desafortunadamente no puedo aceptar dos mensajes, por lo que Dennis fue simplemente más rápido. Pero gracias, sin embargo, especialmente por su explicación grep.
ftiaronsem
1

para imprimir la primera columna:

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

Puede incorporar otras reglas en awk para agregar o eliminar entradas según sea necesario.

EDITAR: lo mismo ocurre con ifconfig (como señaló Doug)

ifconfig | awk '{print $1}'

Este es un ejemplo que excluye la interfaz 'lo'

ifconfig | awk '{if ($1 != lo) print $1}'
MaQleod
fuente
Eso no funcionará. awkignorará el espacio en blanco inicial e imprimirá la primera palabra en cada línea posterior también.
Doug Harris
Desafortunadamente, eso no funciona, sufriendo el problema exacto que Doug señaló. Pero gracias por tu ayuda, sin embargo, realmente aprecio que hayas ayudado a un novato como yo.
ftiaronsem
1
/usr/sbin/ip addr show | awk '/^[1-9]/ {print $2}'

proporciona

lo:
eth0:
eth1:
eth2:

como salida

Promod
fuente
1

Aunque exista una solución aceptada, me gustaría presentar mi solución a esto.

Tengo un montón de interfaces virtuales, y me gustaría obtener una lista, utilizable en varios scripts de 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

No estoy interesado en el loopback, ya que sé que está allí :)

Este one-liner hace el trabajo:

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

Produce una salida como:

eth0
eth0:1
eth0:2
eth0:3

Disfrutar.

Mogens TrasherDK
fuente
1

Toda la solución anterior funciona bien. Aún así puedes probar esto

ifconfig | grep HW | cut -c 1-6

Como, loque es loopback, no tiene asignada una dirección HW, no aparecerá.

Salida -

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

La solución más fácil está en el hombre ifconfig (8)

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

El indicador -l se puede usar para enumerar todas las interfaces disponibles en el sistema, sin otra información adicional. El uso de este indicador es mutuamente exclusivo con todos los demás indicadores y comandos, excepto para -d (solo enumera las interfaces que están inactivas) y -u (solo enumera las interfaces que están activadas).

Entonces, para tener la lista, use:

ifconfig -l

Los nombres estarán separados por un espacio, por lo que debe usar sed para reemplazar estos espacios por un \ n:

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

Syberam
fuente
1

Mejorado:

netstat -i | grep '^[a-z]' | awk '{print $1}' | grep -v 'lo'
Bob Smith
fuente
1
Probablemente deberías hacer eso grep -v '^lo$'; su comando actual excluirá el (ejemplo hipotético) logicaly las ridiculousinterfaces.
Scott
0

Ninguna de las soluciones anteriores funcionó para mí, aquí está mi solución:

ifconfig -a  | egrep "^[a-z]+" | sed "s/: .*//" | grep -v "lo"
  1. Lista todas las interfaces disponibles
  2. Extraiga solo las líneas que contienen nombres de dispositivos (sin espacio al principio)
  3. Retire la parte posterior no relacionada que está después del primer espacio
  4. Excluir lointerfaz

Salidas:

eth0
eth0:1
wlan0
ceremcem
fuente
0

"ifcongif -l" debería hacer el trabajo. su salida es así "lo0 gif0 stf0 en0 ..." sin nueva línea.

Lo encontré en algún sitio web pero ya no puedo encontrarlo. y todavía estoy buscando el significado de esa bandera "-l".

ALMA ANTIGUA
fuente
0

Algunas veces, nettools no está instalado de manera predeterminada. Por lo tanto, me gusta usar comandos integrados que tienen más garantía dentro de / bin, / usr / bin y / usr / sbin sin tener que preocuparme por los paquetes instalados.

ip addr: muestra / manipula enrutamiento, dispositivos, enrutamiento de políticas y túneles (dirección)
grep: busca un espacio y luego cualquier cosa después de unitl:
cut: usa (:) como delimitador y obtén el campo 2
tr: elimina cualquier espacio

$ ip addr | grep -E ': \ s. * ?:' | corte -d ":" -f 2 | tr -d ""
Joseph Steven Martinez
fuente
0

Probado en macOS, funcionó lo siguiente. Necesitaba encontrar todas las interfaces que estaban ARRIBA. Esto se basa en la respuesta de Dennis Williamson arriba.

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

indirección
fuente
-1

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

ttbakiatwoam
fuente
1
¿Podría por favor ampliar y explicar qué hace esto? Las respuestas de una línea generalmente no son un buen formato para Superusuario.
Doktoro Reichard