153 votes

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

Dans un environnement Linux, je dois détecter l'état physique de connexion ou de déconnexion d'un connecteur RJ45 à sa prise. De préférence en utilisant uniquement des scripts BASH.

Les solutions suivantes, qui ont été proposées sur d'autres sites, ne fonctionnent PAS à cette fin :

  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 encore opérationnel.
  2. Ping d'un hôte - puisque le produit se trouvera dans un réseau local utilisant une configuration réseau inconnue et des 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 s'y trouve) ?

Comment le monde Linux est-il censé avoir sa propre version de la bulle Windows qui apparaît dans la barre d'icônes pour indiquer que vous venez de débrancher le câble réseau ?


Kent Fredric y lothar les deux réponses répondent à mon besoin... merci beaucoup ! Laquelle je vais utiliser... Je ne sais toujours pas.

Je suppose que je ne peux pas vous inscrire tous les deux comme la bonne réponse ? Et c'est probablement juste pour vous que je n'en choisisse qu'une. On tire à pile ou face, je suppose ? Encore une fois, merci !

236voto

Kent Fredric Points 35592

Vous voulez regarder les noeuds dans

/sys/class/net/

J'ai fait des expériences avec le mien :

Fil branché :

eth0/carrier:1
eth0/operstate:unknown

Fil retiré :

eth0/carrier:0
eth0/operstate:down

Le fil est à nouveau branché :

eth0/carrier:1
eth0/operstate:up

Truc de côté : récolter toutes les propriétés en même temps de manière simple :

grep "" eth0/* 

Cela forme une belle liste de key:value paires.

8 votes

Notez que, comme le dit Marco ci-dessous, l'interface doit être active (même si elle n'est pas configurée) pour demander ces valeurs.

13 votes

Grep "" eth0/* est si élégant et facile, merci ! :) Avec le commutateur -s, grep ne se plaindra pas des répertoires.

2 votes

Je préfère : grep -H . eth0/* : Cette méthode efface plusieurs lignes et imprime le nom de l'entrée en fonction de chaque ligne.

89voto

lothar Points 11904

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 des liens, vous pouvez utiliser grep :

$ sudo ethtool eth0 | grep Link
    Link detected: yes

0 votes

Ip link | grep BROADCAST |cut -d ':' -f 2 | while read i ; do echo $i ; ethtool $i | grep Link ; done

3 votes

Notez que, comme le dit Marco ci-dessous, l'interface doit être active (même si elle n'est pas configurée) pour demander ces valeurs.

0 votes

C'est génial ! j'avais un moyen de vérifier si ethernet est disponible, si ethernet est activé, si ethernet est connecté mais aucun moyen de vérifier si le câble réel était connecté. grep Link le fait. Merci !

27voto

Peter Quiring Points 451

Utilisez 'ip monitor' pour obtenir les changements d'état des liens en TEMPS REEL.

3 votes

Dans mon cas, c'est la seule réponse qui a fonctionné... /sys/class/net/eth0/carrier montre toujours 1 lorsque mon câble est débranché alors que ip monitor montre réellement quelque chose

0 votes

Un développement de cette méthode pourrait être remercié, Peter. Quelque chose comme un exemple qui répond à la question originale sur la connaissance de l'état de la fiche du câble.

18voto

Marco Points 101

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

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

Alors d'abord :

ifconfig ethX up

Ensuite :

cat /sys/class/net/ethX

4 votes

Essayez "cat /sys/class/net/eth[n]/operstate" où [n] est le numéro du périphérique eth.

0 votes

Cela vous indique seulement si eth[n] est en place, si c'est le cas, cela ne vous dit pas si le câble est connecté ou non.

0 votes

@Brice, en effet, vous voulez vérifier le fichier ethX/carrier qui vaut 1 si la 'porteuse' est détectée, ce qui signifie qu'un câble est connecté et transporte des données...

9voto

Ambroz Bizjak Points 3398

À bas niveau, ces événements peuvent être capturés à l'aide de rtnetlink sans polling. Remarque : si vous utilisez rtnetlink, vous devez travailler ensemble avec udev, ou votre programme peut être confus quand udev renomme une nouvelle interface réseau.

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

Par exemple, un simple NCD script qui imprimera "cable in" et "cable out" sur 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 :)
}

(en 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 viendraient entre les deux, comme par exemple :

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 partie importante à noter est que l'exécution est autorisée à régresser ; dans le deuxième exemple, par exemple, si le câble est retiré, l'adresse IP sera automatiquement supprimée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X