Detectar interfaces de red en bash y si tienen el cable de red conectado | Algo de Linux

martes, 18 de diciembre de 2012

Detectar interfaces de red en bash y si tienen el cable de red conectado

En ocasiones necesitamos detectar en nuestros scripts bash, qué interfaces de red hay en el sistema y si están conectadas o no. Hay unas cuantas maneras de hacerlo, pero habitualmente suelo usar el comando ip.

El comando ip nos permite gestionar rutas, dispositivos, reglas de enrutamiento y túneles.  Para detectar las interfaces de red sólo necesito utilizar:
  • ip link show muestra todas las interfaces.
  • ip link show up muestra las interfaces que tienen el cable conectado.
Así, si quiero obtener los nombres de las interfaces de red que hay en el sistema, no tengo más que ejecutar:

# ip link show|grep ^[0-9]| grep -v lo|cut -f2 -d":"|sed 's/^[ \t]*//'


Y si tan sólo quiero obtener los nombres de las interfaces de red que tienen el cable conectado:

# ip link show up|grep ^[0-9]| grep -v lo|cut -f2 -d":"|sed 's/^[ \t]*//'

Cuando utilizamos ip link, podemos obtener las direcciones mac de las interfaces de red. Ahora bien, si en lugar de usar ip link, usamos ip addr, podremos obtener también las direcciones IP:
  • ip addr show muestra todas las interfaces.
  • ip addr show up muestra las interfaces que tienen el cable conectado.
Por ejemplo: Si quiero obtener la dirección mac de la interfaz de red eth0, no tengo más que ejecutar:
# ip link show eth0| grep 'link/ether' | sed 's/^[ \t]*//' | cut -f2 -d" " 
o
# ip addr show eth0 | grep 'link/ether' | sed 's/^[ \t]*//' | cut -f2 -d" "


Y si quiero obtener la dirección IP de la interfaz de red eth0, ejecuto:
# ip addr show eth0 | grep -v inet6 | grep 'inet' | sed 's/^[ \t]*//' | cut -f2 -d" " | cut -f1 -d"/"
Y ya puestos, podemos obtener la máscara de red de la interfaz eth0:
# ip addr show eth0 | grep -v inet6 | grep 'inet' | sed 's/^[ \t]*//' | cut -f2 -d" " | cut -f2 -d"/"  
Y de paso, la dirección de broadcast de la interfaz de red eth0:
# ip addr show eth0 | grep -v inet6 | grep 'inet' | sed 's/^[ \t]*//' | cut -f4 -d" "  

Si quisiera obtener los nombres de las interfaces de red activas, ejecutaría:
# ip addr show | grep "state UP" | awk '{print $2}' | cut -f1 -d":" 

Y si quisiera obtener la ip del gateway por defecto:
# ip route show 0.0.0.0/0 | awk '{print $3}'