簡體   English   中英

如何獲取Python中的網卡名稱?

[英]How to get Network Interface Card names in Python?

有沒有辦法在機器等中獲取 NIC 卡的名稱。eth0,瞧? 如果是這樣,你是怎么做到的?

我已經研究過,但到目前為止我只找到了獲取 IP 地址和 MAC 地址的代碼,例如

import socket
socket.gethostbyname(socket.gethostname())

非常感謝有關代碼的建議。

在Linux上,您只需列出/ sys / class / net /中的鏈接即可

os.listdir('/sys/class/net/')

不確定這是否適用於所有發行版。

Python >= 3.3 中的socket模塊:

import socket

# Return a list of network interface information
socket.if_nameindex()

https://docs.python.org/3/library/socket.html#socket.if_nameindex

我曾經用過的一個很棒的Python庫就是psutil 它可以在Linux,Windows和OSX等其他平台上使用,並且受Python 2.6到3.6的支持。

Psutil提供net_if_addrs()函數,該函數返回一個字典,其中鍵是NIC名稱,value是分配給NIC的每個地址的命名元組列表,包括地址族,NIC地址,網絡掩碼,廣播地址和目標地址。

使用net_if_addrs()簡單示例將打印NIC名稱的Python列表:

import psutil

addrs = psutil.net_if_addrs()
print(addrs.keys())

由於當我搜索這些信息時,谷歌會彈出這個答案,我想我應該添加我的技術來獲取可用的接口(以及IP地址)。 非常好的模塊netifaces以便攜的方式處理這個問題。

我認為標准庫中沒有任何東西可以查詢這些名稱。

如果我在Linux系統上需要這些名稱,我會解析ifconfig的輸出或/proc/net/dev 查看此博客條目是否存在類似問題。

使用python的ctypes你可以調用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 __name__ == "__main__":
    print(get_interfaces())

請注意,此方法不可移植。

為了補充@Kristian Evensen提到的內容,這里是我用來解決問題的原因。 如果您只想獲得接口列表,請使用:

interface_list = netifaces.interfaces()

如果您想要一個特定的接口,但不知道最后的數字是什么(即:eth0),請使用:

interface_list = netifaces.interfaces()
interface = filter(lambda x: 'eth' in x,interface_list)

就像David Breuer所說,你可以在Linux上列出目錄“/ sys / class / net”。 (它至少適用於Fedora)。 如果您需要有關某些界面的詳細信息,可以在界面的目錄中導航以獲取更多信息。

def getAllInterfaces():
    return os.listdir('/sys/class/net/')

有一個python包get-nic,它提供了NIC狀態,up \\ down,ip addr,mac addr等


pip install get-nic

from get_nic import getnic

getnic.interfaces()

Output: ["eth0", "wlo1"]

interfaces = getnic.interfaces()
getnic.ipaddr(interfaces)

Output: 
{'lo': {'state': 'UNKNOWN', 'inet4': '127.0.0.1/8', 'inet6': '::1/128'}, 'enp3s0': {'state': 'DOWN', 'HWaddr': 'a4:5d:36:c2:34:3e'}, 'wlo1': {'state': 'UP', 'HWaddr': '48:d2:24:7f:63:10', 'inet4': '10.16.1.34/24', 'inet6': 'fe80::ab4a:95f7:26bd:82dd/64'}}

有關更多信息,請參閱GitHub頁面: https//github.com/tech-novic/get-nic-details

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM