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.
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.
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
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.
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.
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
Obtenez l'interface ACTIVE MAC uniquement:
cat /sys/class/net/$(ip addr | awk '/state UP/ {print $2}' | sed 's/.$//')/address
Ce qui suit imprimera uniquement les interfaces configurées pour avoir une adresse IP
ifconfig | grep "inet.*broadcast"