¿Cómo detectar el estado físico conectado de un cable/conector de red?


En un entorno Linux, necesito detectar el estado físico conectado o desconectado de un conector RJ45 a su socket. Preferiblemente usando solo scripting 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á activada actualmente.
  2. Ping a un host-ya que el producto estará dentro de una LAN usando una red desconocida configuración y hosts desconocidos.

¿No hay algún estado que se pueda usar 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 saber.

Supongo que no puedo poner a los dos como la respuesta correcta? Y probablemente sea justo para ti que elija uno. Lanza una moneda supongo? De nuevo, gracias!

Author: Jeach, 2009-04-30

10 answers

Desea ver los nodos en

/sys/class/net/

Experimenté con el mío:

Cable conectado:

eth0/carrier:1
eth0/operstate:unknown

Alambre eliminado:

eth0/carrier:0
eth0/operstate:down

Cable Conectado de Nuevo:

eth0/operstate:up
eth0/carrier:1

Truco secundario: cosechar todas las propiedades a la vez de la manera fácil:

grep "" eth0/* 

Esto forma una buena lista de pares key:value.

 192
Author: Kent Fredric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-09 04:57:21

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
 76
Author: lothar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-30 19:17:07

Use 'ip monitor' para obtener cambios de estado de enlace EN TIEMPO REAL.

 22
Author: Peter Quiring,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-05 21:13:07

cat /sys/class/net/ethX es, con mucho, el método más fácil.

Sin embargo, la interfaz tiene que estar activada, de lo contrario obtendrá un error de argumento no válido.

Así que primero:

ifconfig ethX up

Entonces:

cat /sys/class/net/ethX
 15
Author: Marco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-10 12:32:39

En el nivel bajo, estos eventos se pueden capturar usando rtnetlink sockets, sin ningún sondeo. Nota al margen: si utiliza rtnetlink, tiene que trabajar junto con udev, o su programa puede confundirse cuando udev cambie el nombre de una nueva interfaz de red.

El problema con 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 necesitas algo más poderoso, echa un vistazo a my NCD programming language, un lenguaje de programación diseñado para configuraciones de red.

Por ejemplo, un script NCD simple que imprimirá "cable in" y "cable out" a stdout (suponiendo 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 lo use exclusivamente para configurar la red, por lo que normalmente, los comandos de configuración entrarían en el medio, como:

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");
}

Lo importante parte a tener en cuenta es que la ejecución está permitida para retroceder; en el segundo ejemplo, por ejemplo, si se extrae el cable, la dirección IP se eliminará automáticamente.

 8
Author: Ambroz Bizjak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-01 15:25:10

Existen dos demonios que detectan estos eventos:

Ifplugd y netplugd

 4
Author: germanjaber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-29 23:27:41

La mayoría de las distribuciones modernas de Linux usan NetworkManager para esto. Podrías 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.

 2
Author: andri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-30 19:16:30

Algunas precisiones y trucos

  1. Hago todo esto como usuario normal (no raíz)

  2. Obtener información de dmesg

    Usar dmesg es una de las 1st cosas a hacer para preguntar 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 dependiendo del hardware y los controladores utilizados.

    Nota: esto podría 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 sistema de archivos

    Leer o escribir bajo /syspodría romper su sistema, especialmente si se ejecuta como root! Usted ha sido advertido; -)

    Este es un método de pooling, no un verdadero seguimiento de eventos.

    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 renderizar algo como (una vez que haya desenchufado y enchufado de nuevo, 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
    

    (Hit Enter to exit loop)

    Nota: Esto requiere patch por instalar.

  4. En fin, ya debe haber algo acerca de esto...

    Dependiendo de La instalación de Linux, podría agregar if-up y if-down scripts para poder reaccionar a este tipo de eventos.

    En basado en Debian (como Ubuntu ), puede almacenar sus 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.

 2
Author: F. Hauri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-28 11:28:18

Utilizo este comando para comprobar que un cable está conectado:

cd /sys/class/net/
grep "" eth0/operstate

Si el resultado será arriba o abajo. A veces se muestra desconocido, entonces es necesario comprobar

eth0/carrier

Muestra 0 o 1

 1
Author: Sarvar Nishonboyev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-19 05:59:54

En arch linux. (no estoy seguro en otras distribuciones) puede ver el operstate. que aparece si está conectado o abajo si no el operstate 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
 0
Author: screaminghard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-06 12:06:11