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

问题描述 投票:0回答:10

有没有办法获取机器中网卡的名称等。eth0,lo?如果是的话你会怎么做?

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

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

有关代码的建议将不胜感激。

python networking
10个回答
54
投票

我用来执行此操作的一个很棒的 Python 库是 psutil。它可以在 Linux、Windows 和 OSX 等平台上使用,并且支持 Python 2.6 到 3.6。

Psutil 提供 net_if_addrs() 函数,该函数返回一个字典,其中键是 NIC 名称,值是分配给 NIC 的每个地址的命名元组列表,其中包括地址族、NIC 地址、网络掩码、广播地址和目的地地址。

使用

net_if_addrs()
的简单示例将打印 NIC 名称的 Python 列表:

import psutil

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

46
投票

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

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

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


29
投票
Python 中的

socket
模块 >= 3.3:

import socket

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

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


26
投票

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


13
投票

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

如果我在 Linux 系统上需要这些名称,我会解析

ifconfig
的输出或
/proc/net/dev
的内容。查看此博客条目以了解类似的问题。


8
投票

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

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


7
投票

补充@Kristian Evensen 提到的内容,这是我用于解决我遇到的问题的内容。 如果您只想获取接口列表,请使用:

interface_list = netifaces.interfaces()

如果您想要特定的接口,但不知道末尾的数字是什么(即:eth0),请使用:

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

5
投票

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

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

1
投票

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


0
投票

只需在@andrew 的答案中添加额外的代码即可。这就是 psutil 非常适合我的用例:

import psutil
function get_iface_ip(iface='eth0'):
    ifdata = psutil.net_if_addrs()
    iface_objs = ifdata.get(iface)
    if iface_objs:
        return iface_objs[0].address
© www.soinside.com 2019 - 2024. All rights reserved.