Dans un environnement Linux, je dois détecter l'état physique connecté ou déconnecté d'un connecteur RJ45 à sa prise. 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:
- 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 actif.
- Ping un hôte - puisque le produit sera dans un LAN utilisant une configuration de 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 y est)?
Comment le monde Linux est-il supposé avoir sa propre version de la bulle Windows qui apparaît dans la barre d'icônes indiquant que vous venez de débrancher le câble réseau?
Kent Fredric et Lothar , vos deux réponses satisfont mon besoin ... merci beaucoup! Lequel j'utiliserai ... Je ne sais toujours pas.
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. Lancez une pièce, je suppose? Merci encore!
grep -H . eth0/*
Ce whipe emty lines et print nom d'entrée avec appartiennent à chaque ligne.grep -s "" eth0/*
Vous pouvez utiliser ethtool :
Pour obtenir uniquement l'état du lien, vous pouvez utiliser grep:
la source
grep Link
le fait. Je vous remercie!!up
état.Utilisez 'ip monitor' pour obtenir les changements d'état des liens en TEMPS RÉEL.
la source
1
quand mon câble est déconnecté alorsip monitor
qu'il montre réellement quelque chosecat /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 non valide.
Alors d'abord:
Ensuite:
la source
ethX/carrier
qui vaut 1 si le 'carrier' est détecté, c'est-à-dire qu'un câble est connecté et transporte des données ...Au bas niveau, ces événements peuvent être interceptés à l'aide de sockets rtnetlink , sans aucune interrogation. Remarque: si vous utilisez rtnetlink, vous devez travailler avec udev, sinon votre programme peut être confus lorsque udev renomme une nouvelle interface réseau.
Le problème avec les configurations de réseau avec des scripts shell est que les scripts shell sont terribles pour la gestion des événements (comme un câble réseau connecté et déconnecté). Si vous avez besoin de quelque chose de plus puissant, jetez un œil à mon langage de programmation NCD , un langage de programmation conçu pour les configurations réseau.
Par exemple, un simple script NCD qui imprimera «cable in» et «cable out» sur stdout (en supposant que l'interface est déjà active):
(en interne,
net.backend.waitlink()
utilise rtnetlink etnet.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 se situent entre les deux, telles que:
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.
la source
Il existe deux démons qui détectent ces événements:
ifplugd et netplugd
la source
ifplugstatus
outil duifplugd
démon. Pas besoin d'arguments, tapez simplementifplugstatus
et vous obtiendrez tous les NIC branchés ou débranchés.La plupart des distributions Linux modernes utilisent NetworkManager pour cela. Vous pouvez utiliser D-BUS pour écouter les événements.
Si vous souhaitez qu'un outil de ligne de commande vérifie l'état, vous pouvez également l'utiliser
mii-tool
, étant donné que vous avez à l'esprit Ethernet.la source
mii-tool
semble être la seule commande qui peut signaler l'état de la liaison lorsque l'interface est en panne.J'utilise cette commande pour vérifier qu'un fil est connecté:
Si le résultat sera à la hausse ou à la baisse. Parfois, cela montre inconnu, alors vous devez vérifier
Il montre 0 ou 1
la source
Quelques précisions et astuces
Je fais tout cela en tant qu'utilisateur normal (pas root )
Récupérer les informations de
dmesg
L'utilisation
dmesg
est l'une des premières choses à faire pour demander l'état actuel du système:pourrait répondre à quelque chose comme:
ou
selon l'état, le message peut varier en fonction du matériel et des pilotes utilisés.
Nota: cela pourrait être écrit
dmesg|grep eth.*Link.is|tail -n1
mais je préfère utilisersed
.Test autour d'un
/sys
pseudo système de fichiersLire ou écrire sous
/sys
peut casser votre système, surtout s'il est exécuté en tant que root ! Tu as été prévenu ;-)Il s'agit d'une méthode de mise en commun, pas d'un véritable suivi des événements .
Pourrait rendre quelque chose comme (une fois que vous avez débranché et rebranché, selon):
(Frappé Enter pour quitter la boucle)
Nota: Cela nécessite
patch
d'être installé.In fine, il doit déjà y avoir quelque chose à ce sujet ...
En fonction de l' installation Linux , vous pouvez ajouter
if-up
etif-down
des scripts pour être en mesure de réagir à ce genre d'événements.Sur Debian (comme Ubuntu ), vous pouvez stocker vos scripts dans
voir
man interfaces
pour plus d'infos.la source
e1000
et l' événement pourrait se produire à un autre moment que936555.596870
, mais vous verrez toujoursNIC Link is
.Vous pouvez utiliser ifconfig.
Si l'entrée indique RUNNING, l'interface est physiquement connectée. Cela sera affiché indépendamment de la configuration de l'interface.
C'est juste une autre façon d'obtenir les informations
/sys/class/net/eth0/operstate
.la source
sur arch linux. (Je ne suis pas sûr sur les autres distributions) vous pouvez voir l'operstate. qui apparaît s'il est connecté ou en panne sinon l'operstate vit
la source
ou pour moi devient plus rapide:
Il écoutera le fichier syslog.
Résultat (en cas de déconnexion et après 4 secondes de connexion à nouveau):
la source
D'une manière ou d'une autre, si vous voulez vérifier si le câble Ethernet est branché sous linux après la recommandation: "ifconfig eth0 down". Je trouve une solution: utilisez l'outil ethtool.
si le câble est connecté, le test de liaison est 0, sinon 1.
la source
J'utilisais mon appareil amélioré OpenWRT comme répéteur (qui ajoute des capacités Ethernet virtuel et LAN sans fil) et j'ai trouvé que le transporteur / sys / class / net / eth0 et les valeurs opstate n'étaient pas fiables. J'ai joué avec /sys/class/net/eth0.1 et /sys/class/net/eth0.2 ainsi avec (au moins à ma conclusion) aucun moyen fiable de détecter que quelque chose était physiquement branché et de parler sur tout des ports Ethernet. J'ai trouvé un moyen un peu brut mais apparemment fiable de détecter si quelque chose avait été branché depuis le dernier état de redémarrage / mise sous tension au moins (ce qui fonctionnait exactement comme j'en avais besoin dans mon cas).
Vous obtiendrez un 0 si rien n'a été branché et quelque chose> 0 si quelque chose a été branché (même s'il a été branché et retiré depuis) depuis le dernier cycle de mise sous tension ou de redémarrage.
J'espère que cela aide au moins quelqu'un!
la source