verificar ver una tengo tarjetas servidores saber para monitorear interfaces cuantas como comandos básicos linux networking connection detection

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:

  1. Usando ''ifconfig'' - ya que un cable de red puede estar conectado pero la red no está configurada correctamente o no está activa.
  2. 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

  1. Hago todo esto como usuario normal (no root )

  2. 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 escrito dmesg|grep eth.*Link.is|tail -n1 pero prefiero usar sed .

    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

  3. Prueba alrededor de /sys pseudo filesystem

    Leer 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 .

  4. En fin, ya debe haber algo sobre esto ...

    Dependiendo de la instalación de Linux , puede agregar scripts if-up y if-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