Comment détecter l'état connecté physique d'un câble/connecteur réseau?

Dans un environnement Linux, j'ai besoin de détecter l'état physique connecté ou déconnecté d'un connecteur RJ45 sur sa socket. De préférence en utilisant uniquement les scripts BASH.

Les solutions suivantes qui ont été proposées sur d'autres sites ne fonctionnent pas à cet effet:

  1. Utilisation de 'ifconfig' - car un câble réseau peut être connecté mais le réseau n'est pas correctement configuré ou n'est pas actuellement en place.
  2. Ping un hôte-puisque le produit sera dans un réseau local en utilisant un réseau inconnu configuration et hôtes inconnus.

N'y a-t-il pas un État qui peut être utilisé dans le système de fichiers /proc (tout le reste est là)?

Comment le monde Linux est-il supposé avoir sa propre version de la bulle Windows qui apparaît à partir du plateau d'icônes indiquant que vous venez de débrancher le câble réseau?


Kent Fredric et lothar, les deux de vos réponses satisfaire mon besoin... merci beaucoup! Celui que je vais utiliser... Je n'ai toujours pas savoir.

Je suppose que je ne peux pas vous mettre tous les deux comme la bonne réponse? Et c'est probablement juste pour vous que j'en choisisse un. Retourner une pièce je suppose? Encore une fois, merci!

121
demandé sur Jeach 2009-04-30 23:08:08

10 réponses

Vous voulez regarder les nœuds

/sys/class/net/

J'ai expérimenté avec le mien:

Fil Branché:

eth0/carrier:1
eth0/operstate:unknown

Fil Enlevé:

eth0/carrier:0
eth0/operstate:down

Fil branché à nouveau:

eth0/operstate:up
eth0/carrier:1

astuce latérale: récolter toutes les propriétés à la fois de manière simple:

grep "" eth0/* 

Cela forme une belle liste de key:value paires.

192
répondu Kent Fredric 2014-05-09 04:57:21

Vous pouvez utiliser 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

Pour obtenir uniquement l'État du lien, vous pouvez utiliser grep:

$ sudo ethtool eth0 | grep Link
    Link detected: yes
76
répondu lothar 2009-04-30 19:17:07

Utilisez 'IP monitor' pour obtenir des changements d'état de liaison en temps réel.

22
répondu Peter Quiring 2012-09-05 21:13:07

cat /sys/class/net/ethX est de loin la méthode la plus simple.

L'interface doit être en place, sinon vous obtiendrez une erreur d'argument invalide.

Donc d'abord:

ifconfig ethX up

Puis:

cat /sys/class/net/ethX
15
répondu Marco 2011-11-10 12:32:39

Au niveau bas, ces événements peuvent être interceptés en utilisant les sockets rtnetlink , sans interrogation. Remarque: Si vous utilisez rtnetlink, vous devez travailler avec udev, ou votre programme peut être confus lorsque udev renomme une nouvelle interface réseau.

Le problème avec les configurations réseau avec les scripts shell est que les scripts shell sont terribles pour la gestion des événements (comme un câble réseau étant branché et éteint). Si vous avez besoin de quelque chose de plus puissant, jetez un oeil à mon MNT langage de programmation, un langage de programmation conçu pour les configurations de réseau.

Par exemple, un script NCD simple qui imprimera "cable in" et "cable out" vers stdout (en supposant que l'interface est déjà en place):

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 :)
}

(interne, net.backend.waitlink() utilise rtnetlink, et net.backend.waitdevice() utilise udev)

L'idée de NCD est que vous l'utilisez exclusivement pour configurer le réseau, donc normalement, les commandes de configuration entreraient entre les deux, telles que:

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

L'important partie à noter est que l'exécution est autorisée à régression; dans le deuxième exemple, par exemple, si le câble est sorti, l'adresse IP sera automatiquement supprimé.

8
répondu Ambroz Bizjak 2011-11-01 15:25:10

Il existe deux démons qui détectent ces événements:

Ifplugd et netplugd

4
répondu germanjaber 2013-08-29 23:27:41

La plupart des distributions Linux modernes utilisent NetworkManager pour cela. Vous pouvez utiliser D-BUS pour écouter les événements.

Si vous voulez un outil de ligne de commande pour vérifier l'état, vous pouvez également utiliser mii-tool, étant donné que vous avez Ethernet à l'esprit.

2
répondu andri 2009-04-30 19:16:30

Quelques précisions et astuces

  1. Je fais tout ce que normal utilisateur (pas racine)

  2. Saisir les infos de dmesg

    L'utilisation de dmesg est l'une des 1ère choses à faire pour demander état actuel du système:

    dmesg | sed '/eth.*Link is/h;${x;p};d'
    

    Pourrait répondre à quelque chose comme:

    [936536.904154] e1000e: eth0 NIC Link is Down
    

    Ou

    [936555.596870] e1000e: eth0 NIC Link is Up 100 Mbps Full Duplex, Flow Control: Rx/Tx
    

    Selon l'état, le message peut varier en fonction du matériel et des pilotes utilisés.

    Nota: cela pourrait par écrit dmesg|grep eth.*Link.is|tail -n1 mais je préfère utiliser 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. Testez autour de /sys pseudo système de fichiers

    La lecture ou l'écriture sous /sys pourrait casser votre système, surtout si elle est exécutée en tant que root! Vous avez été averti; -)

    C'est une méthode de regroupement, pas un vrai suivi des événements.

    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
    

    Pourrait rendre quelque chose comme (une fois que vous avez débranché et branché, selon):

    +++ -   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
    

    (appuyez sur entrez pour quitter la boucle)

    Nota: cela nécessite {[13] } à installer.

  4. In fine, il doit déjà y avoir quelque chose à ce sujet...

    Selon l'Installation de Linux , Vous pouvez ajouter des scripts if-up et if-down pour pouvoir réagir à ce genre d'événements.

    Sur Debian basé (comme Ubuntu), vous pouvez stocker vos scripts dans

    /etc/network/if-down.d
    /etc/network/if-post-down.d
    /etc/network/if-pre-up.d
    /etc/network/if-up.d
    

    Voir man interfaces pour plus d'infos.

2
répondu F. Hauri 2017-05-28 11:28:18

J'utilise cette commande pour vérifier qu'un fil est connecté:

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

Si le résultat sera HAUT OU BAS. Parfois, il montre inconnu, alors vous devez vérifier

eth0/carrier

Il montre 0 ou 1

1
répondu Sarvar Nishonboyev 2014-08-19 05:59:54

Sur Arch linux. (Je ne suis pas sûr sur d'autres distributions) vous pouvez voir l'operstate. qui apparaît si connecté ou vers le bas sinon l'operstate vit sur

/sys/class/net/(interface name here)/operstate
#you can also put watch 
watch -d -n -1 /sys/class/net/(interface name here)/operstate
0
répondu screaminghard 2017-10-06 12:06:11