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.

Respuestas:


17

Prueba esto:

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

Esto omitirá lo:

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

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

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

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.

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

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]'

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.


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}'

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


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.


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

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'


1

Mejorado:

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

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

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".


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 ""

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'


-1

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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.