Je suis totalement nouveau en programmation python, alors soyez patient avec moi.
Est-il possible d’obtenir le nom des cartes NIC dans la machine, etc. eth0, lo? Si oui, comment faites-vous?
J'ai effectué des recherches, mais jusqu'à présent, je n'ai trouvé que des codes pour obtenir des adresses IP et des adresses MAC, tels que
import socket
socket.gethostbyname(socket.gethostname())
Des conseils sur les codes seraient vraiment appréciés. Merci!
Je ne pense pas qu'il y ait quoi que ce soit dans la bibliothèque standard pour interroger ces noms.
Si j'avais besoin de ces noms sur un système Linux, j'analyserais la sortie de ifconfig
ou le contenu de /proc/net/dev
. Regardez cette entrée de blog pour un problème similaire.
Sous Linux, vous pouvez simplement lister les liens dans/sys/class/net/by
os.listdir('/sys/class/net/')
Pas sûr que cela fonctionne sur toutes les distributions.
Étant donné que cette réponse apparaît dans Google lorsque je recherche ces informations, j'ai décidé d'ajouter ma technique pour obtenir les interfaces disponibles (ainsi que les adresses IP). Le très joli module netifaces s’occupe de cela, de manière portable.
Une excellente bibliothèque Python que j’ai utilisée pour cela est psutil . Il peut être utilisé sous Linux, Windows et OSX entre autres plates-formes et est pris en charge de Python 2.6 à 3.6.
Psutil fournit la fonction net_if_addrs () qui renvoie un dictionnaire dans lequel les clés sont les noms NIC et la valeur est une liste de nuplets nommés pour chaque adresse affectée au NIC qui inclut la famille d'adresses, NIC adresse, masque de réseau, adresse de diffusion et adresse de destination.
Un exemple simple utilisant net_if_addrs()
qui imprimera une liste Python des noms NIC:
import psutil
addrs = psutil.net_if_addrs()
print(addrs.keys())
Pour ajouter aux mentions de @Kristian Evensen, voici ce que j'ai utilisé pour résoudre un problème que j'avais. Si vous souhaitez simplement obtenir une liste des interfaces, utilisez:
interface_list = netifaces.interfaces()
Si vous voulez une interface spécifique, mais ne savez pas quel est le nombre à la fin (ie: eth0), utilisez
interface_list = netifaces.interfaces()
interface = filter(lambda x: 'eth' in x,interface_list)
En utilisant ctypes
de python, vous pouvez appeler la fonction de bibliothèque C getifaddrs
:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from ctypes import *
class Sockaddr(Structure):
_fields_ = [('sa_family', c_ushort), ('sa_data', c_char * 14)]
class Ifa_Ifu(Union):
_fields_ = [('ifu_broadaddr', POINTER(Sockaddr)),
('ifu_dstaddr', POINTER(Sockaddr))]
class Ifaddrs(Structure):
pass
Ifaddrs._fields_ = [('ifa_next', POINTER(Ifaddrs)), ('ifa_name', c_char_p),
('ifa_flags', c_uint), ('ifa_addr', POINTER(Sockaddr)),
('ifa_netmask', POINTER(Sockaddr)), ('ifa_ifu', Ifa_Ifu),
('ifa_data', c_void_p)]
def get_interfaces():
libc = CDLL('libc.so.6')
libc.getifaddrs.restype = c_int
ifaddr_p = pointer(Ifaddrs())
ret = libc.getifaddrs(pointer((ifaddr_p)))
interfaces = set()
head = ifaddr_p
while ifaddr_p:
interfaces.add(ifaddr_p.contents.ifa_name)
ifaddr_p = ifaddr_p.contents.ifa_next
libc.freeifaddrs(head)
return interfaces
if __== "__main__":
print(get_interfaces())
Notez cependant que cette méthode n'est pas portable.
Comme David Breuer le dit, vous pouvez simplement lister le répertoire "/ sys/class/net" sous Linux. (Cela fonctionne au moins sur Fedora). Si vous avez besoin d’informations détaillées sur une interface, vous pouvez naviguer dans les répertoires d’interfaces.
def getAllInterfaces():
return os.listdir('/sys/class/net/')