una - ver interfaces de red linux ubuntu
¿Cómo detectar el estado físico conectado de un cable/conector de red? (10)
En un entorno Linux, necesito detectar el estado físico conectado o desconectado de un conector RJ45 en su socket. Preferentemente, utilizar solo scripts de 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.
- Hacer ping en 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 de Linux tiene su propia versión de la burbuja de Windows que emerge de 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 es probable que sea justo para ti que elija uno. Lanzar una moneda, supongo? ¡Gracias otra véz!
Algunas precisiones y trucos
Hago todo esto como usuario normal (no root )
Obtener información de
dmesg
El uso de
dmesg
es una de las primeras cosas que debe hacer para consultar el estado actual del sistema:dmesg | sed ''/eth.*Link is/h;${x;p};d''
podría responder algo como:
[936536.904154] e1000e: eth0 NIC Link is Down
o
[936555.596870] e1000e: eth0 NIC Link is Up 100 Mbps Full Duplex, Flow Control: Rx/Tx
dependiendo del estado, el mensaje puede variar según el hardware y los controladores utilizados.
Nota: esto podría
dmesg|grep eth.*Link.is|tail -n1
por escritodmesg|grep eth.*Link.is|tail -n1
pero prefiero usarsed
.dmesg | sed ''/eth.*Link is/h;${x;s/^.*Link is //;p};d'' Up 100 Mbps Full Duplex, Flow Control: Rx/Tx dmesg | sed ''/eth.*Link is/h;${x;s/^.*Link is //;p};d'' Down
Prueba alrededor de
/sys
pseudo filesystemLeer o escribir en
/sys
podría romper 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.
cd /tmp grep -H . /sys/class/net/eth0/* 2>/dev/null >ethstate while ! read -t 1;do grep -H . /sys/class/net/eth0/* 2>/dev/null | diff -u ethstate - | tee >(patch -p0) | grep ^+ done
Podría representar algo así como (una vez que haya desenchufado y enchufado, dependiendo):
+++ - 2016-11-18 14:18:29.577094838 +0100 +/sys/class/net/eth0/carrier:0 +/sys/class/net/eth0/carrier_changes:9 +/sys/class/net/eth0/duplex:unknown +/sys/class/net/eth0/operstate:down +/sys/class/net/eth0/speed:-1 +++ - 2016-11-18 14:18:48.771581903 +0100 +/sys/class/net/eth0/carrier:1 +/sys/class/net/eth0/carrier_changes:10 +/sys/class/net/eth0/duplex:full +/sys/class/net/eth0/operstate:up +/sys/class/net/eth0/speed:100
(Presione Enter para salir del bucle)
Nota: Esto requiere que se instale el
patch
.En fin, ya debe haber algo sobre esto ...
Dependiendo de la instalación de Linux , puede agregar scripts
if-up
yif-down
para poder reaccionar a este tipo de eventos.En Debian (como Ubuntu ), puedes guardar tus scripts en
/etc/network/if-down.d /etc/network/if-post-down.d /etc/network/if-pre-up.d /etc/network/if-up.d
ver
man interfaces
para más información.
En el nivel bajo, estos eventos se pueden atrapar 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 de 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 enchufado y apagado). Si necesita algo más poderoso, 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 adentro" y "cable afuera" a stdout (asumiendo que la interfaz ya está activada):
process foo {
# Wait for device to appear and be configured by udev.
net.backend.waitdevice("eth0");
# Wait for cable to be plugged in.
net.backend.waitlink("eth0");
# Print "cable in" when we reach this point, and "cable out"
# when we regress.
println("cable in"); # or pop_bubble("Network cable in.");
rprintln("cable out"); # or rpop_bubble("Network cable out!");
# just joking, there''s no pop_bubble() in NCD yet :)
}
(internamente, net.backend.waitlink()
usa rtnetlink, y net.backend.waitdevice()
usa udev)
La idea de NCD es que la utilices exclusivamente para configurar la red, por lo que normalmente los comandos de configuración se intercalarían, como por ejemplo:
process foo {
# Wait for device to appear and be configured by udev.
net.backend.waitdevice("eth0");
# Set device up.
net.up("eth0");
# Wait for cable to be plugged in.
net.backend.waitlink("eth0");
# Add IP address to device.
net.ipv4.addr("eth0", "192.168.1.61", "24");
}
La parte importante a tener en cuenta es que la ejecución puede retroceder ; en el segundo ejemplo, por ejemplo, si se saca el cable, la dirección IP se eliminará automáticamente.
Existen dos daemons que detectan estos eventos:
ifplugd y netplugd
La mayoría de las distribuciones Linux modernas usan NetworkManager para esto. Podría usar D-BUS para escuchar los eventos.
Si desea una herramienta de línea de comandos para verificar el estado, también puede usar mii-tool
, dado que tiene Ethernet en mente.
Puedes usar ethtool :
$ sudo ethtool eth0
Settings for eth0:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised auto-negotiation: Yes
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 0
Transceiver: internal
Auto-negotiation: on
Supports Wake-on: umbg
Wake-on: g
Current message level: 0x00000007 (7)
Link detected: yes
Para obtener solo el estado del Enlace puede usar grep:
$ sudo ethtool eth0 | grep Link
Link detected: yes
Quieres ver los nodos en
/sys/class/net/
Experimenté con el mío:
Cableado conectado:
eth0/carrier:1
eth0/operstate:unknown
Alambre retirado:
eth0/carrier:0
eth0/operstate:down
Cable conectado nuevamente:
eth0/operstate:up
eth0/carrier:1
Truco lateral: cosechar todas las propiedades a la vez de la manera más fácil:
grep "" eth0/*
Esto forma una buena lista de pares key:value
.
Use ''monitor ip'' para obtener cambios de estado de enlace en TIEMPO REAL.
Yo uso este comando para verificar que un cable esté conectado:
cd /sys/class/net/
grep "" eth0/operstate
Si el resultado será arriba o abajo. A veces se muestra desconocido, luego debe verificar
eth0/carrier
Muestra 0 o 1
en el arco de Linux. (no estoy seguro en otras distribuciones) puede ver el estado. que aparece si está conectado o hacia abajo si no el estado vive en
/sys/class/net/(interface name here)/operstate
#you can also put watch
watch -d -n -1 /sys/class/net/(interface name here)/operstate
cat /sys/class/net/ethX
es, de lejos, el método más fácil.
Sin embargo, la interfaz debe estar activa, de lo contrario obtendrá un error de argumento no válido.
Entonces primero:
ifconfig ethX up
Entonces:
cat /sys/class/net/ethX