23 votes

Comment puis-je obtenir la liste de toutes les interfaces réseau actives de manière programmatique ?

Mon objectif est de déterminer l'adresse IP pour Ethernet sur un appareil. Mais en supposant qu'il y ait des connexions comme le WiFi et l'USB Ethernet, y a-t-il un moyen particulier d'obtenir l'IP Ethernet ?

Sur une coquille, je ferais networksetup -listallhardwareports ce qui me donnerait une correspondance entre le port matériel et le dispositif. A partir de là, je dois rechercher dans le périphérique le port matériel : Ethernet et utiliser ifaddr struct pour obtenir mon IP.

Je connais la partie ifaddr, s'il vous plaît suggérez comment faire la première partie de manière programmatique. Existe-t-il une autre approche ?

25voto

user3439894 Points 52496

Il peut y avoir plusieurs façons différentes d'accomplir ce que vous demandez, mais je vais juste lancer cette idée.

J'ai un MacBook Pro qui n'a pas de port Ethernet intégré, donc dans mes exemples je vais utiliser Port matériel : Wi-Fi car je l'ai testé dans les deux exemples ci-dessous et cela a fonctionné, cependant vous pouvez le changer en Port matériel : Ethernet si c'est ce que la sortie de
networksetup -listallhardwareports montre pour vous.

Si vous souhaitez simplement transmettre l'adresse IP du périphérique cible à l'adresse suivante stdout Pour cela, utilisez l'exemple suivant :

$ ipconfig getifaddr $(networksetup -listallhardwareports | awk '/Hardware Port: Wi-Fi/{getline; print $2}')
192.168.1.100

Si vous voulez l'affecter à un variable dans un script Pour cela, utilisez l'exemple suivant :

ipAddress="$(ipconfig getifaddr $(networksetup -listallhardwareports | awk '/Hardware Port: Wi-Fi/{getline; print $2}'))"

Explication :

La sortie pertinente de networksetup -listallhardwareports pour mon système est :

Hardware Port: Wi-Fi
Device: en0
Ethernet Address: 28:cf:e3:10:a4:cd

(Note : Ce n'est pas ma véritable adresse MAC)

Utilisation de $(...) de substitution de commande afin d'avoir quelque chose à transmettre à ipconfig getifaddr <args> Je détermine le nom de l'appareil du port matériel avec la sortie de networksetup -listallhardwareports et tuyau | à travers awk qui recherche Hardware Port: Wi-Fi et utilise le get line qui lit la ligne suivante après la fonction match et est transmis à print $2 qui, en fait, imprime la deuxième partie de la ligne suivant l'élément match qui, dans le cas présent, est en0 et il est transmis à ipconfig getifaddr comme argument dans le premier exemple, par exemple ipconfig getifaddr en0 . Le résultat est l'adresse IP.

Dans le deuxième exemple, un deuxième $(...) La substitution de commande est utilisée autour de la ligne de commande complexe utilisée pour l'option stdout pour l'assigner à l ipAddress variable lorsqu'il est utilisé dans un script .

Note : Ceci est vraiment un exemple car je ne l'ai pas codé pour tenir compte du fait que l'appareil est hors service. En d'autres termes, si l'appareil n'a pas d'adresse IP, il n'y aura pas de sortie vers la fonction stdout et rien n'est attribué à la ipAddress variable dans le script . Bien que dans le script il peut être codé pour tester si oui ou non la ipAddress variable est vide et agir en conséquence.

1voto

totaam Points 117

Utilice SCNetworkInterfaceCopyAll pour obtenir une liste d'interfaces, puis filtrer celles qui ne renvoient pas l'information. Ethernet avec SCNetworkInterfaceGetInterfaceType . De là, vous pouvez obtenir la passerelle et le masque, etc - en Python, j'utilise netifaces pour ça.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X