vérifier si l'interface eth0 est active (configurée)

30

Je dois vérifier avec un script s'il eth0est configuré. Si c'est le cas, le script ne fera rien. Sinon, cela commencera wlan0. (Je ne veux pas les deux eth0et wlan0être debout en même temps).

Quelle serait la façon la plus simple de vérifier, si eth0c'est déjà le cas?

J'utilise Debian Wheezy

CLARIFICATION:

Je voudrais vérifier non seulement que le câble eth0est branché, mais plutôt que l'interface est configurée (c'est-à-dire qu'elle a un IP fixe ou qu'elle a reçu une IP DHCP). Si le câble est branché, mais eth0n'est pas configuré correctement, je veux commencerwlan0

user1968963
la source
2
Je ne suis pas sûr de ce que je vais dire, mais cat /sys/class/net/ | grep eth0je devrais vous donner des données facilement analysables. Vous pouvez aussi fairesudo ethtool eth0 | grep Link
Kiwy

Réponses:

45

Vous pouvez le faire de plusieurs façons. Voici un exemple:

$ cat /sys/class/net/eth0/operstate
up
cuonglm
la source
5
Malheureusement, cela ne garantit pas que l'interface est entièrement configurée. Vous pouvez cat /sys/class/net/eth0/carrier, pour vérifier un signal, mais il peut ne pas encore avoir de bail DHCP, etc.
orodbhen
7
ip a show ethX up

Si rien ne s'affiche alors votre interface est en panne

max
la source
Cette méthode: "ip a show ethX up" et vérifier la sortie, n'est pas suffisante
Joshua Clayton
5
ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing 

Nous avons donc ici grepl' ipoutil omniprésent stdoutpour une ligne qui contient à la fois notre interface d'intérêt et la phrase "état UP" (merci à @Lekensteyn pour avoir souligné la nécessité d'un peu plus de spécificité que juste UP). Nous utilisons l'argument acomme forme abrégée pour addresset cela devrait être suffisant pour obtenir une liste de toutes les cartes réseau configurées dans le système.

Un avantage à utiliser ippourrait être qu'il devrait vraiment être disponible partout - c'est ainsi que je configure couramment les périphériques réseau de mon téléphone Android, par exemple.

Les :colonssont utilisés pour éviter les correspondances partielles - de cette façon, nous garantissons une correspondance pour eth0par opposition à une autre possibilité someothereth0ou eth007.

Merci @RaphaelAhrens de m'avoir poussé vers l'exactitude et d'expliquer ma solution.

MODIFIER:

Pour gérer les exigences actuelles, vous pouvez:

ip a | sed -rn '/: '"$if"':.*state UP/{N;N;s/.*inet (\S*).*/\1/p}'

Ce qui précède n'imprimera une adresse IP CIDR que si votre cible $ifest UP, branchée et en a une. Pour ipv6, la solution est tout aussi simple avec seulement des modifications mineures.

Si vous n'aimez pas, sedvous pouvez obtenir des résultats similaires avec un autre |pipe ... grepet ajouter une -Aoption de contexte à la première grep- mais j'aime sed.

Mikeserv
la source
1
Vous devez expliquer ce que vous faites. Pour que tout le monde puisse bénéficier de votre réponse.
Raphael Ahrens
5
C'est insuffisant. La sortie contient également UPsi le dispositif est en place, mais pas de câble est connecté: 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000. Vous pouvez également spécifier l'appareil pour éviter les faux positifs: ip addr show dev eth0.
Lekensteyn
0

Les autres méthodes ne fonctionnent pas, mais celle-ci le fait (sur Ubuntu au moins):

while true; do
    ip route | grep "linkdown"
    if [ $? -eq 0 ]; then
        sleep 1  # network not yet up
    else
        break   # network up
    fi
done
xinthose
la source
Il n'y a pas de "linkdown" avec grep ip routesur Debian Stretch.
Ingo