Cómo usar ifconfig para mostrar solo la interfaz activa

22

De forma predeterminada ifconfig, me mostrará todas las interfaces disponibles, pero ¿qué sucede si solo quiero mostrarlas active? Como, en0solo abajo.

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether 14:10:9f:e0:eb:c9 
    inet6 fe80::1610:9fff:fee0:ebc9%en0 prefixlen 64 scopeid 0x4 
    inet X.X.X.X netmask 0xffffff00 broadcast 101.6.69.255
    nd6 options=1<PERFORMNUD>
    media: autoselect
    **status: active**
en3: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    options=60<TSO4,TSO6>
    ether 32:00:14:e7:4f:80 
    media: autoselect <full-duplex>
    **status: inactive**

El aviso ifconfig en0no satisfará, en0no siempre es el activo;)

Estoy ejecutando Mac OS X.

qweruiop
fuente
2
Su sistema operativo sería algo importante para mencionar ya que las ifconfigimplementaciones varían. Además, ¿por qué es ifconfigobligatorio el uso ? ¿Cuál es tu objetivo final?
jordanm
Hola @jordanm, mi objetivo es obtener la dirección IP de la interfaz actualmente activa, a menudo una interfaz Ethernet inalámbrica o cableada.
qweruiop
¿Cómo define la interfaz activa?
AnonymousLurker

Respuestas:

24

Para obtener una descripción completa de todos los servicios activos, intente:

ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active'

Esta expresión regular simple debería filtrar solo las interfaces activas y toda su información. Supongo que ponga un alias para esto en su archivo ~ / .profile o ~ / .bash_profile (¿tal vez si es activo?)

Para obtener el nombre de la interfaz (útil para los scripts), use:

ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active' | egrep -o -m 1 '^[^\t:]+'

Tienes que instalar pcregrep para que esto funcione. Está en macports en el paquete pcre. Alternativamente, esto debería funcionar con GNU grep usando en grep -Pzolugar de pcregrep -M -opero con el resto igual, pero no lo he probado.

g. cohete
fuente
2

Si solo desea imprimir la "entrada" si contiene status: active, entonces podría usar algo como este programa awk como filtro para la salida ifconfig :

#!/usr/bin/awk -f
BEGIN            { print_it = 0 }
/status: active/ { print_it = 1 }
/^($|[^\t])/     { if(print_it) print buffer; buffer = $0; print_it = 0 }
/^\t/            { buffer = buffer "\n" $0 }
END              { if(print_it) print buffer }

Cuando comienza cada "entrada" (una línea está vacía o no comienza con una pestaña), comience a guardar la entrada en un búfer. Agregue a este búfer cualquier línea posterior que comience con una Tabulación. Esté atento a la cuerda mágica status: active; si se vio una línea como esa, imprima el búfer (la "entrada" anterior) cuando comience una nueva "entrada" (o finalice la entrada).

Guarde el texto del programa anterior en un archivo y úselo así:

ifconfig -a | awk -f /path/to/file

O, si usa chmod +xel archivo, puede simplificarlo un poco:

ifconfig -a | /path/to/file
Chris Johnsen
fuente
2

Si no es adverso a algunas secuencias de comandos bash, puede hacer esto:

for i in $(ifconfig -lu); do if ifconfig $i | grep -q "status: active" ; then echo $i; fi; done

Eso enumerará las interfaces de red activas. Probado en Mac OS X 10.13.

Lo bueno es que no necesitas instalar nada. Simplemente ejecute lo anterior en una Terminal.

Claudio
fuente
Esta debería ser la mejor respuesta, sin embargo ifconfig -lu, no funcionará en Debian. Pero OP está utilizando MacOS de todos modos, por lo que esta solución funcionaría en sistemas con BSD ifconfig. ifconfig -lu
Publiqué
1

Al leer sus comentarios y preguntas, parece que realmente desea obtener las interfaces que tienen asignada una dirección IP.

Puede hacer esto rápidamente con ifconfigy grep.

Ejecutando el comando:

ifconfig | grep 'Link\|inet'

Debe producir algo similar a:

eth0 Enlace de enlace: Ethernet HWaddr 00: 11: 22: 33: 44: 55
eth1 Enlace de enlace: Ethernet HWaddr 00: 11: 22: 33: 44: 66  
          inet addr: 192.168.0.8 Bcast: 192.168.0.255 Máscara: 255.255.255.0
lo Link encap: Loopback local  
          inet addr: 127.0.0.1 Máscara: 255.0.0.0

Esto mostraría cada línea con un nombre de interfaz y una IP si tuvieran una.

Alguna magia REGEX más específica podría darte exactamente lo que necesitas.

Nathan McCoy
fuente
2
Gracias, pero ¿dónde está la activeconsideración?
qweruiop
si hay una línea después de la interfaz, entonces tiene asignada una dirección IP, y por lo que entiendo, se consideraría como "activa".
Nathan McCoy
1

Desearía que la pregunta fuera un poco más clara. Suponiendo que por Active interface only, pretendía mostrar solo el nombre de las interfaces activas (en mi caso UPy RUNNINGestado active) sin ningún otro detalle. Entonces intente esto:

ifconfig | \
  grep "UP\|RUNNIG" \
  | awk '{print $1}' \
  | grep ':' \
  | tr -d ':' \
  | grep -v lo

La salida se vería así:

en0
en1
en2
bridge0
p2p0
awdl0
llw0
utun0
utun1
utun2
utun3
en6

Ajuste el grep -vcampo y agregue más interfaces no deseadas como loopback-> loetc., si es necesario.

Ahora, si lo desea y necesita verificar si las interfaces encontradas están activas actualmente. Entonces podemos simplemente pasarlos como un argumento para lo ifconfig <interface>que se muestra a continuación:

[[ $(ifconfig en0 | grep -w active) ]] && echo "en0 is active"

Simplificando esto aún más e implementándolo en una función:

checkActiveInterfaces()
{
  local intARR=( $(ifconfig | \
      grep "UP\|RUNNIG" \
      | awk '{print $1}' \
      | grep ':' \
      | tr -d ':' \
      | grep -v lo) );
    intARR=( $(printf "%s\n" "${intARR[@]}" | sort -u) );
    for i in "${intARR[@]}"; do
      [[ $(ifconfig $i | grep -w active) ]] && {
       echo "$i"
    }
    done
}

La ejecución de esta función devolverá solo las interfaces activas. En mi caso:

awdl0
en0
llw0
Rakib Fiha
fuente
0

A continuación se imprimirán solo aquellas interfaces que estén configuradas para tener una IP

ifconfig | grep "inet.*broadcast"
Yousif Atique
fuente
0

Obtenga solo la interfaz ACTIVE MAC:

cat /sys/class/net/$(ip addr | awk '/state UP/ {print $2}' | sed 's/.$//')/address
Alex P
fuente
Tenga en cuenta que MacOS no tiene ippor defecto; necesitas HomeBrew para eso, luego corre brew install iproute2macuna vez. El código fuente está en github.com/brona/iproute2mac
Jeroen Wiert Pluimers
-1
$ ifconfig | grep "inet addr:" | grep -v 127.0.0.1 | sed -e 's/Bcast//' | cut -d: -f2

Cómo funciona:

  • ifconfig
  • Grep para líneas que contienen "inet addr"
    • Estas líneas contienen las IP.
  • Grep para líneas que no contienen "127.0.0.1"
    • Por lo general, no nos importa localhost.
    • -v es grep invertido
  • De las líneas restantes, elimine el "Bcast"
  • Corte el campo 2 usando ":" como delimitador
    • Imprime la respuesta.
ohlemacher
fuente
-1
ifconfig en0 | grep status

Esto mostrará el estado de la conexión ethernet en0

Swartenfagen
fuente