Comment utiliser ifconfig pour afficher uniquement l'interface active

22

Par défaut ifconfig, toutes les interfaces disponibles seront affichées, mais que se passe-t-il si je souhaite simplement en afficher une active? Comme, en0seulement en 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**

L'avis ifconfig en0ne satisfera pas, en0n'est pas toujours actif;)

J'utilise Mac OS X.

qweruiop
la source
2
Votre système d'exploitation serait quelque chose d'important à mentionner car les ifconfigimplémentations varient. Aussi, pourquoi l'utilisation est-elle ifconfigune exigence? Quel est votre objectif final?
jordanm
Salut @jordanm, mon objectif est d'obtenir l'adresse IP de l'interface actuellement active, souvent une interface Ethernet filaire ou sans fil.
qweruiop
comment définissez-vous l'interface active?
AnonymousLurker

Réponses:

24

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 en utilisant grep -Pzoau lieu de pcregrep -M -omais avec le reste le même, mais je n'ai pas testé cela.

g.rocket
la source
2

Si vous ne souhaitez imprimer "l'entrée" que si elle contient status: active, vous pouvez utiliser quelque chose comme ce programme awk 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) quand une nouvelle «entrée» commence (ou 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 avez chmod +xle fichier, vous pouvez le simplifier un peu:

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

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.

Claudio
la source
Cela devrait être la meilleure réponse, mais ifconfig -lune fonctionnera pas sur Debian. Mais OP utilise quand même MacOS, donc cette solution fonctionnerait sur les systèmes avec BSD ifconfig. J'ai posté une autre réponse ci-dessous qui fait la même chose sans utiliserifconfig -lu
Rakib Fiha
1

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 ifconfiget grep.

Exécution de la commande:

ifconfig | grep 'Link\|inet'

Devrait produire quelque chose de similaire à:

eth0 Link encap: Ethernet HWaddr 00: 11: 22: 33: 44: 55
eth1 Link encap: 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 Link encap: boucle locale  
          inet addr: 127.0.0.1 Mask: 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.

Nathan McCoy
la source
2
Merci mais où est la activeconsidération?
qweruiop
s'il y a une ligne après l'interface, alors elle a une adresse IP qui lui est assignée, et par ce que je suppose que vous entendez, elle constituerait «active».
Nathan McCoy
1

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 UPet mon RUNNINGétat 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 grep -vchamp et ajoutez des interfaces plus indésirables comme loopback-> loetc, 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
Rakib Fiha
la source
0

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

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

Obtenez l'interface ACTIVE MAC uniquement:

cat /sys/class/net/$(ip addr | awk '/state UP/ {print $2}' | sed 's/.$//')/address
Alex P
la source
Notez que MacOS n'a pas ippar défaut; vous avez besoin de HomeBrew pour cela, puis exécutez brew install iproute2macune fois. Le code source est à github.com/brona/iproute2mac
Jeroen Wiert Pluimers
-1
$ ifconfig | grep "inet addr:" | grep -v 127.0.0.1 | sed -e 's/Bcast//' | cut -d: -f2

Comment ça fonctionne:

  • ifconfig
  • Grep pour les lignes contenant "inet addr"
    • Ces lignes contiennent les IP.
  • Grep pour les lignes qui ne contiennent pas "127.0.0.1"
    • Nous ne nous soucions généralement pas de l'hôte local.
    • -v est grep inversé
  • Des lignes restantes, supprimez le "Bcast"
  • Couper le champ 2 en utilisant ":" comme délimiteur
    • Imprime la réponse.
ohlemacher
la source
-1
ifconfig en0 | grep status

Cela montrera l'état de la connexion Ethernet en0

swartenfagen
la source