web-dev-qa-db-fra.com

Comment utiliser ifconfig pour afficher uniquement l'interface active

Par défaut, ifconfig affichera toutes les interfaces disponibles, mais que se passe-t-il si je veux simplement afficher les active celles? Comme, en0 uniquement ci-dessous.

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether 14:10:9f:e0:eb:c9 
    inet6 fe80::1610:9fff:fee0:ebc9%en0 prefixlen 64 scopeid 0x4 
    inet X.X.X.X netmask 0xffffff00 broadcast 101.6.69.255
    nd6 options=1<PERFORMNUD>
    media: autoselect
    **status: active**
en3: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    options=60<TSO4,TSO6>
    ether 32:00:14:e7:4f:80 
    media: autoselect <full-duplex>
    **status: inactive**

Remarquer ifconfig en0 ne satisfera pas, en0 n'est pas toujours actif;)

J'utilise Mac OS X.

24
qweruiop

Pour obtenir une description complète de tous les services actifs, essayez:

ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active'

Ce regex simple devrait filtrer uniquement les interfaces actives et toutes leurs informations. Je vous suggère de mettre un alias pour cela dans votre fichier ~/.profile ou ~/.bash_profile (peut-être ifactive?)

Pour obtenir simplement le nom de l'interface (utile pour les scripts), utilisez:

ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active' | egrep -o -m 1 '^[^\t:]+'

Vous devez installer pcregrep pour que cela fonctionne. C'est sur macports dans le paquet pcre. Alternativement, cela devrait fonctionner avec GNU grep utilisant grep -Pzo au lieu de pcregrep -M -o mais avec le reste pareil, mais je n'ai pas testé cela.

24
Gavin S. Yancey

Si vous ne souhaitez imprimer l’entrée que si elle contient status: active, alors vous pourriez utiliser quelque chose comme ça awk programme comme filtre pour la sortie ifconfig:

#!/usr/bin/awk -f
BEGIN            { print_it = 0 }
/status: active/ { print_it = 1 }
/^($|[^\t])/     { if(print_it) print buffer; buffer = $0; print_it = 0 }
/^\t/            { buffer = buffer "\n" $0 }
END              { if(print_it) print buffer }

Lorsque chaque "entrée" démarre (une ligne est vide ou ne commence pas par un onglet), commencez à enregistrer l'entrée dans un tampon. Ajoutez à ce tampon toutes les lignes suivantes commençant par un Tab. Surveillez la chaîne magique status: active; si une ligne comme celle-ci a été vue, imprimez le tampon (l '"entrée" précédente) lorsqu'une nouvelle "entrée" commence (ou que l'entrée se termine).

Enregistrez le texte du programme ci-dessus dans un fichier et utilisez-le comme ceci:

ifconfig -a | awk -f /path/to/file

Ou, si vous chmod +x le fichier, vous pouvez alors le simplifier un peu:

ifconfig -a | /path/to/file
2
Chris Johnsen

Si vous n'êtes pas opposé à certains scripts bash, vous pouvez le faire:

for i in $(ifconfig -lu); do if ifconfig $i | grep -q "status: active" ; then echo $i; fi; done

Cela listera les interfaces réseau actives. Testé sur Mac OS X 10.13.

La bonne chose est que vous n'avez rien à installer. Exécutez simplement ce qui précède dans un terminal.

2
Claudio

En lisant vos commentaires et vos questions, il semble que vous souhaitiez simplement obtenir les interfaces auxquelles une adresse IP leur a été attribuée.

Vous pouvez le faire rapidement avec ifconfig et grep.

Exécution de la commande:

ifconfig | grep 'Link\|inet'

Devrait produire quelque chose de similaire à:

 eth0 Encap Link: Ethernet HWaddr 00: 11: 22: 33: 44: 55 
 eth1 Encap Link: Ethernet HWaddr 00: 11: 22: 33: 44: 66 
 inet addr: 192.168.0.8 Bcast: 192.168.0.255 Masque: 255.255.255.0 
 lo Encapsulation de lien: boucle locale 
 inet addr: 127.0.0.1 Masque: 255.0.0.0 

Cela afficherait chaque ligne avec un nom d'interface et et IP s'ils en avaient un.

Une magie REGEX plus spécifique pourrait vous fournir exactement ce dont vous avez besoin.

1
Nathan McCoy

J'aimerais que la question soit un peu plus claire. En supposant que par Active interface only, Vous vouliez afficher le nom des interfaces actives uniquement (dans mon cas UP et RUNNING status active) sans aucun autre détail. Essayez ensuite ceci:

ifconfig | \
  grep "UP\|RUNNIG" \
  | awk '{print $1}' \
  | grep ':' \
  | tr -d ':' \
  | grep -v lo

La sortie ressemblerait à:

en0
en1
en2
bridge0
p2p0
awdl0
llw0
utun0
utun1
utun2
utun3
en6

Ajustez le champ grep -v Et ajoutez des interfaces plus indésirables comme loopback -> lo etc, si nécessaire.

Maintenant, si vous le souhaitez et que vous devez vérifier si les interfaces trouvées sont actuellement actives. Ensuite, nous pouvons simplement les passer comme argument pour ifconfig <interface> Comme indiqué ci-dessous:

[[ $(ifconfig en0 | grep -w active) ]] && echo "en0 is active"

Simplifier encore plus et l'implémenter dans une fonction:

checkActiveInterfaces()
{
  local intARR=( $(ifconfig | \
      grep "UP\|RUNNIG" \
      | awk '{print $1}' \
      | grep ':' \
      | tr -d ':' \
      | grep -v lo) );
    intARR=( $(printf "%s\n" "${intARR[@]}" | sort -u) );
    for i in "${intARR[@]}"; do
      [[ $(ifconfig $i | grep -w active) ]] && {
       echo "$i"
    }
    done
}

L'exécution de cette fonction ne retournera que les interfaces actives. Dans mon cas:

awdl0
en0
llw0
1
Rakib Fiha

Obtenez l'interface ACTIVE MAC uniquement:

cat /sys/class/net/$(ip addr | awk '/state UP/ {print $2}' | sed 's/.$//')/address
0
Alex P

Ce qui suit imprimera uniquement les interfaces configurées pour avoir une adresse IP

ifconfig | grep "inet.*broadcast"
0
Yousif Atique