comprobar si la interfaz eth0 está activa (configurada)


30

Necesito verificar con un script, si eth0está configurado. Si es así, el guión no hará nada. De lo contrario, comenzará wlan0. (No quiero ambos eth0y wlan0estar despierto al mismo tiempo).

¿Cuál sería la forma más fácil de verificar si eth0ya está funcionando?

Estoy usando Debian Wheezy

ACLARACIÓN:

Me gustaría comprobar no solo que el cable eth0está enchufado, sino que la interfaz está configurada (es decir, tiene un conjunto de IP estático o ha recibido un IP de DHCP). Si el cable está enchufado, pero eth0no está configurado correctamente, quiero comenzarwlan0


2
No estoy seguro de lo que voy a decir, pero cat /sys/class/net/ | grep eth0debería darle datos fácilmente analizables. También podría hacerlosudo ethtool eth0 | grep Link
Kiwy

Respuestas:


45

Puedes hacerlo de muchas maneras. Aquí un ejemplo:

$ cat /sys/class/net/eth0/operstate
up

55
Desafortunadamente, esto no garantiza que la interfaz esté completamente configurada. Puede gato /sys/class/net/eth0/carrier, para comprobar si hay una señal, pero todavía no puede tener una concesión DHCP sin embargo, etc
orodbhen

7
ip a show ethX up

Si no se muestra nada, entonces su interfaz está inactiva


Este método: "ip a show ethX up" y verificar la salida, no es suficiente
Joshua Clayton

5
ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing 

Así que aquí tenemos greplas ipherramientas ubicuas stdoutpara una línea que contiene tanto nuestra interfaz de interés como la frase "estado ARRIBA" (gracias a @Lekensteyn por señalar la necesidad de un poco más de especificidad que simplemente UP). Usamos el argumento acomo forma abreviada addressy eso debería ser suficiente para obtener una lista de todas las tarjetas de red configuradas en el sistema.

Una ventaja de usar ippodría ser que realmente debería estar disponible en todas partes; es cómo configuro comúnmente los dispositivos de red de mi teléfono Android, por ejemplo.

Se :colonsutilizan para evitar coincidencias parciales, de esta manera garantizamos una coincidencia en eth0lugar de una posible someothereth0o no eth007.

Gracias @RaphaelAhrens por empujarme hacia la corrección y explicar mi solución.

EDITAR:

Para manejar los requisitos actuales puede:

ip a | sed -rn '/: '"$if"':.*state UP/{N;N;s/.*inet (\S*).*/\1/p}'

Lo anterior solo imprimirá una dirección IP CIDR si su objetivo $ifestá ARRIBA, enchufado y tiene una. Para ipv6, la solución es igual de simple con solo modificaciones menores.

Si no le gusta sed, podría lograr resultados similares con otro |pipe ... grepy agregar una -Aopción de contexto a la primera grep, pero me gusta sed.


1
Debes explicar lo que estás haciendo. Para que todos puedan beneficiarse de su respuesta.
Raphael Ahrens

55
Esto es insuficiente. La salida también contiene UPsi el dispositivo está levantado, pero no hay un cable conectado es: 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000. También puede especificar el dispositivo para evitar falsos positivos: ip addr show dev eth0.
Lekensteyn

0

Los otros métodos no funcionan, pero este sí (al menos en Ubuntu):

while true; do
    ip route | grep "linkdown"
    if [ $? -eq 0 ]; then
        sleep 1  # network not yet up
    else
        break   # network up
    fi
done

No hay "linkdown" con ip routeel que lidiar en Debian Stretch.
Ingo
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.