En un entorno Linux, necesito detectar el estado físico conectado o desconectado de un conector RJ45 a su zócalo. Preferiblemente utilizando solo secuencias de comandos BASH.
Las siguientes soluciones que se han propuesto en otros sitios NO funcionan para este propósito:
- Usando 'ifconfig' - ya que un cable de red puede estar conectado pero la red no está configurada correctamente o no está activa
- Haga ping a un host, ya que el producto estará dentro de una LAN utilizando una configuración de red desconocida y hosts desconocidos.
¿No hay algún estado que pueda usarse en el sistema de archivos / proc (todo lo demás está ahí)?
¿Cómo se supone que el mundo Linux tiene su propia versión de la burbuja de Windows que aparece en la bandeja de iconos que indica que acaba de desconectar el cable de red?
Kent Fredric y lothar , ambas respuestas satisfacen mi necesidad ... ¡muchas gracias! Cuál usaré ... Todavía no lo sé.
¿Supongo que no puedo ponerlos a ambos como la respuesta correcta? Y probablemente sea justo para ti que yo elija uno. ¿Lanzar una moneda, supongo? ¡Gracias otra véz!
fuente
grep -H . eth0/*
este tipo de líneas vacías y el nombre de la entrada de impresión pertenecen a cada línea.grep -s "" eth0/*
Puedes usar ethtool :
Para obtener solo el estado del enlace, puede usar grep:
fuente
grep Link
lo hace. ¡¡Gracias!!up
declarar.Use 'monitor ip' para obtener cambios de estado del enlace en TIEMPO REAL.
fuente
1
cuando mi cable está desconectado mientrasip monitor
realmente muestra algocat /sys/class/net/ethX
Es, con mucho, el método más fácil.Sin embargo, la interfaz debe estar activada, de lo contrario obtendrá un error de argumento no válido.
Entonces primero:
Luego:
fuente
ethX/carrier
que es 1 si se detecta el 'operador', lo que significa que hay un cable conectado y que transporta datos ...En el nivel bajo, estos eventos pueden capturarse utilizando sockets rtnetlink , sin ningún sondeo. Nota al margen: si usa rtnetlink, debe trabajar junto con udev, o su programa puede confundirse cuando udev cambia el nombre de una nueva interfaz de red.
El problema al hacer configuraciones de red con scripts de shell es que los scripts de shell son terribles para el manejo de eventos (como un cable de red conectado y desconectado). Si necesita algo más potente, eche un vistazo a mi lenguaje de programación NCD , un lenguaje de programación diseñado para configuraciones de red.
Por ejemplo, un simple script NCD que imprimirá "cable in" y "cable out" en stdout (suponiendo que la interfaz ya esté activa):
(internamente,
net.backend.waitlink()
usa rtnetlink ynet.backend.waitdevice()
usa udev)La idea de NCD es que lo use exclusivamente para configurar la red, por lo que normalmente, los comandos de configuración se interpondrían entre ellos, como:
La parte importante a tener en cuenta es que la ejecución puede retroceder ; en el segundo ejemplo, por ejemplo, si se extrae el cable, la dirección IP se eliminará automáticamente.
fuente
Existen dos demonios que detectan estos eventos:
ifplugd y netplugd
fuente
ifplugstatus
herramienta delifplugd
demonio. No necesita argumentos, simplemente escribaifplugstatus
y obtendrá toda la NIC como conectada o desconectada.La mayoría de las distribuciones modernas de Linux usan NetworkManager para esto. Podrías usar D-BUS para escuchar los eventos.
Si desea que una herramienta de línea de comandos verifique el estado, también puede usarla
mii-tool
, dado que tiene en mente Ethernet.fuente
mii-tool
parece ser el único comando que puede informar sobre el estado del enlace cuando la interfaz está inactiva.Uso este comando para verificar que un cable esté conectado:
Si el resultado será arriba o abajo. A veces se muestra desconocido, entonces debe verificar
Muestra 0 o 1
fuente
Algunas precisiones y trucos
Hago todo esto como usuario normal (no root )
Agarra información de
dmesg
Usar
dmesg
es una de las primeras cosas que debe hacer para consultar el estado actual del sistema:podría responder algo como:
o
según el estado, el mensaje puede variar según el hardware y los controladores utilizados.
Nota: esto podría ser escrito
dmesg|grep eth.*Link.is|tail -n1
pero prefiero usarlosed
.Prueba alrededor del
/sys
pseudo sistema de archivosLeer o escribir debajo
/sys
podría dañar su sistema, ¡especialmente si se ejecuta como root ! Has sido advertido ;-)Este es un método de agrupación, no un seguimiento de eventos reales .
Podría representar algo como (una vez que haya desenchufado y enchufado de nuevo, dependiendo):
(Presione Enterpara salir del bucle)
Nota: Esto requiere
patch
ser instalado.En fin, ya debe haber algo sobre esto ...
Dependiendo de la instalación de Linux , puede agregar
if-up
yif-down
secuencias de comandos para poder reaccionar a este tipo de eventos.En Debian (como Ubuntu ), puede almacenar sus scripts en
ver
man interfaces
para más información.fuente
e1000
y podría ocurrir un evento en otro momento936555.596870
, pero de todos modos veráNIC Link is
.Usted puede utilizar ifconfig.
Si la entrada muestra EN EJECUCIÓN, la interfaz está físicamente conectada. Esto se mostrará independientemente de si la interfaz está configurada.
Esta es solo otra forma de obtener la información
/sys/class/net/eth0/operstate
.fuente
en el arco de linux. (No estoy seguro en otras distribuciones) puede ver el estado operativo. que aparece si está conectado o abajo si no el estado operativo sigue vivo
fuente
o para mí más rápido consigue:
Escuchará el archivo syslog.
Resultado (si se desconecta y después de 4 segundos se vuelve a conectar):
fuente
De alguna manera, si desea verificar si el cable de Ethernet se conectó a Linux después del comando: "ifconfig eth0 down". Encuentro una solución: use la herramienta ethtool.
si el cable está conectado, la prueba de enlace es 0, de lo contrario es 1.
fuente
Estaba usando mi dispositivo mejorado OpenWRT como repetidor (que agrega capacidades virtuales de ethernet y LAN inalámbrica) y descubrí que los valores de operador / opsato / sys / class / net / eth0 no eran confiables. Jugué con /sys/class/net/eth0.1 y /sys/class/net/eth0.2 también con (al menos en mi opinión) ninguna forma confiable de detectar que algo estaba conectado físicamente y hablando en cualquier de los puertos ethernet. Descubrí una forma un poco cruda pero aparentemente confiable de detectar si algo se había conectado desde el último estado de reinicio / encendido al menos (que funcionó exactamente como lo necesitaba en mi caso).
Obtendrá un 0 si no se ha conectado nada y algo> 0 si se ha conectado algo (incluso si se conectó y se retiró) desde el último ciclo de encendido o reinicio.
Espero que esto ayude a alguien al menos!
fuente