Puedes hacerlo de muchas maneras. Aquí un ejemplo:
$ cat /sys/class/net/eth0/operstate
up
ip a show ethX up
Si no se muestra nada, entonces su interfaz está inactiva
ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing
Así que aquí tenemos grep
el omnipresente ip
herramienta stdout
para una línea que contiene nuestra interfaz de interés y la frase "state UP" (gracias a @Lekensteyn por señalar la necesidad de un poco más de especificidad que solo UP
). Usamos el argumento a
como la forma abreviada de address
y eso debería ser suficiente para obtener una lista de todas las tarjetas de red configuradas en el sistema.
Una ventaja de usar ip
podría ser que debería estar disponible en todas partes; por ejemplo, así es como configuro los dispositivos de red de mi teléfono Android.
El :colons
se utilizan para evitar coincidencias parciales; de esta forma, garantizamos una coincidencia para eth0
a diferencia de un posible someothereth0
o eth007
.
Gracias @RaphaelAhrens por empujarme hacia la corrección y explicar mi solución.
EDITAR:
Para manejar los requisitos actuales, podría:
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 $if
es ARRIBA, enchufado, y tiene uno. Para ipv6, la solución es igual de simple con solo una pequeña modificación.
Si no te gusta sed
podría lograr resultados similares con otro |pipe ... grep
y añadiendo un -A
opción de contexto al primer grep
- pero me gusta sed
.