web-dev-qa-db-fra.com

Comment obtenir les noms de cartes d'interface réseau en Python?

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!

17
JavaNoob

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.

10
Arlaharen

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.

25
David Breuer

É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.

15
Kristian Evensen

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())
15
andrew

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)
5
nihiser

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.

4
tijko

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/')
0
André Pires