如何在Python中获取网络接口卡名称?

时间:2010-10-01 06:55:31

标签: python networking

我对python编程完全陌生,所以请耐心等待。

无论如何都要在机器等处获取NIC卡的名称eth0,lo?如果是这样,你怎么做?

我已经研究过但到目前为止我只找到了代码来获取IP地址和MAC地址,例如

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

对这些代码的建议真的很感激。谢谢!

9 个答案:

答案 0 :(得分:26)

在Linux上,你可以通过

列出 / sys / class / net / 中的链接
os.listdir('/sys/class/net/')

不确定这是否适用于所有发行版。

答案 1 :(得分:17)

由于我搜索此信息时会在Google中弹出这个答案,我认为我应该添加我的技术来获取可用的接口(以及IP地址)。非常好的模块netifaces以便携的方式处理这个问题。

答案 2 :(得分:16)

我曾经做过的一个很棒的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())

答案 3 :(得分:10)

我认为标准库中没有任何内容可以查询这些名称。

如果我在Linux系统上需要这些名称,我会解析ifconfig的输出或/proc/net/dev的内容。查看此blog entry是否存在类似问题。

答案 4 :(得分:5)

为了补充@Kristian Evensen提到的内容,这里是我用来解决问题的方法。 如果您只想获得接口列表,请使用:

interface_list = netifaces.interfaces()

如果您想要一个特定的界面,但不知道最后的数字是什么(即:eth0),请使用:

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

答案 5 :(得分:5)

使用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())

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

答案 6 :(得分:1)

就像David Breuer所说,你可以在Linux上列出目录“/ sys / class / net”。 (它至少适用于Fedora)。如果您需要有关某些界面的详细信息,可以在界面的目录中导航以获取更多信息。

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

答案 7 :(得分:1)

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

答案 8 :(得分:0)

有一个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