web-dev-qa-db-fra.com

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

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

Quelle serait la façon la plus simple de vérifier si eth0 est déjà en place?

J'utilise Debian Wheezy

CLARIFICATION:

Je voudrais non seulement vérifier que le câble dans eth0 est branché, mais plutôt que l'interface est configurée (c'est-à-dire qu'elle a un ensemble d'adresses IP statiques ou qu'elle a reçu une adresse IP DHCP). Si le câble est branché, mais eth0 n'est pas configuré correctement, je veux démarrer wlan0

31
user1968963

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

$ cat /sys/class/net/eth0/operstate
up
48
cuonglm
ip a show ethX up

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

7
max
ip a | grep -Eq ': eth0:.*state UP' || _do_your_thing 

Nous voici donc grep l'omniprésent ip outil stdout pour une ligne qui contient à la fois notre interface d'intérêt et la phrase "state UP" (merci à @Lekensteyn d'avoir souligné la nécessité d'un peu plus de spécificité que juste UP). Nous utilisons l'argument a comme forme abrégée pour address et cela devrait être assez pour obtenir une liste de toutes les cartes réseau configurées dans le système.

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

Le :colons sont utilisés pour éviter les correspondances partielles - de cette façon, nous garantissons une correspondance pour eth0 par opposition à un autre possible someothereth0 ou eth007.

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

ÉDITER:

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 $if est UP, branché et en a un. Pour ipv6, la solution est tout aussi simple avec seulement des modifications mineures.

Si vous n'aimez pas sed, vous pourriez obtenir des résultats similaires avec un autre |pipe ... grep et en ajoutant un -A option de contexte à la première grep - mais j'aime sed.

5
mikeserv

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
0
xinthose