当前位置: 代码网 > it编程>前端脚本>Python > Python实现获取本机网卡的MAC地址,IP地址和路由表

Python实现获取本机网卡的MAC地址,IP地址和路由表

2026年05月08日 Python 我要评论
一、获取mac地址1、单个网卡>>> import uuid>>> address = hex(uuid.getnode())[2:]>>> '-

一、获取mac地址

1、单个网卡

>>> import uuid
>>> address = hex(uuid.getnode())[2:]
>>> '-'.join(address[i:i+2] for i in range(0, len(address), 2))
'f0-03-8c-09-8c-34'

2、获取多网卡mac地址

使用pip安装python扩展库psutil,运行以下的代码:

from psutil import net_if_addrs
for k, v in net_if_addrs().items():
    for item in v:
        address = item[1]
        if '-' in address and len(address)==17:
            print(address)

二、获取本机ip地址

1、windows下:

python标准库socket中有可以获取本机ipv4地址的方法,下面是网上非常常见的一种用法:

>>> import socket
>>> hostname = socket.gethostname()
>>> hostname
'desktop-i734j3o'
>>> socket.gethostbyname(hostname)
'192.168.0.103'

2、mac下:

上面的代码在windows下运行良好,但是无意中发现在mac系统下运行不正常,返回的是本机回环地址127.0.0.1,而不是真正的ip地址。经过查阅大量资料,终于发现socket模块中另一个函数的妙用,那就是getaddrinfo()函数,该函数用法为getaddrinfo(host, port, family=0, type=0, proto=0, flags=0),返回值是一个五元组的列表,该五元组形式为(family, type, proto, canonname, sockaddr),其中最后一个元素sockaddr对于ipv4协议是(ip address, port)形式的元组,而对于ipv6协议是(address, port, flow info, scope id)形式的元组,也就是说,不管是ipv4还是ipv6,上面的函数都可以正确地获取ip地址。
于是,继续上面的代码:

>>> addrs = socket.getaddrinfo(hostname,none)
>>> for item in addrs:
     print(item)
(, 0, 0, '', ('fe80::b976:b065:27d:3747%10', 0, 0, 10))
(, 0, 0, '', ('fe80::1456:951:2418:27cf%7', 0, 0, 7))
(, 0, 0, '', ('192.168.0.103', 0))
(, 0, 0, '', ('2001:0:9d38:6ab8:1456:951:2418:27cf', 0, 0, 0))

如此便可以获取本机所有ipv4和ipv6地址,如果只想获取ipv4地址,再继续执行下面的代码:

>>> [item[4][0] for item in addrs if ':' not in item[4][0]][0]
'192.168.0.103'

三、路由表

方法:采用arp协议获取局域网内所有计算机的ip地址与mac地址,思路是使用系统命令arp获取arp表并生成文本文件,然后从文件中读取和解析信息。

import os
from socket import gethostbyname, gethostname

 获取本机ip地址

host = gethostbyname(gethostname())

获取arp表

os.system('arp -a > temp.txt')
with open('temp.txt') as fp:
    for line in fp:
        line = line.split()[:2]
        if line and\
           line[0].startswith(host[:4]) and\
           (not line[0].endswith('255')):
            print(':'.join(line))

四、方法补充

在 python 中获取本机网卡的 mac 地址、ip 地址和路由表,可以使用跨平台库 psutil 和 netifaces,同时结合系统命令作为备选方案。下面给出完整的实现示例。

安装所需库

pip install psutil netifaces

psutil 用于获取网卡信息(mac、ip),netifaces 用于获取路由表(网关等)。

获取所有网卡的 mac 地址和 ip 地址

使用 psutil.net_if_addrs() 可以获取每个网卡的所有地址(包括 ipv4、ipv6、mac 等)。

import psutil
def get_network_interfaces():
    """获取所有网卡的 mac 地址和 ipv4 地址"""
    interfaces = {}
    for iface, addrs in psutil.net_if_addrs().items():
        # 跳过虚拟、回环等无用网卡(可根据需要调整)
        if iface.startswith(('lo', 'loopback', 'vethernet', 'docker', 'vboxnet')):
            continue
        mac = none
        ipv4 = none
        for addr in addrs:
            if addr.family == psutil.af_link:   # mac 地址
                mac = addr.address
            elif addr.family == socket.af_inet: # ipv4 地址
                ipv4 = addr.address
        if mac or ipv4:
            interfaces[iface] = {'mac': mac, 'ipv4': ipv4}
    return interfaces
if __name__ == '__main__':
    import socket
    for name, info in get_network_interfaces().items():
        print(f"网卡: {name}")
        print(f"  mac地址: {info['mac']}")
        print(f"  ipv4地址: {info['ipv4']}")

输出示例

网卡: eth0
  mac地址: 00:15:5d:01:02:03
  ipv4地址: 192.168.1.100

获取路由表

获取路由表在不同操作系统上的方法不同。推荐使用 netifaces 获取默认网关,或调用系统命令获取详细路由表。

方法1:使用 netifaces 获取默认网关及路由条目

import netifaces
def get_gateways():
    """获取默认网关"""
    gateways = netifaces.gateways()
    default = gateways['default']
    print("默认网关:")
    for family, (gw, iface) in default.items():
        print(f"  协议: {family}, 网关: {gw}, 网卡: {iface}")
def get_routing_table():
    """获取路由表(linux/unix 使用 /proc/net/route,windows 调用 route print)"""
    import platform
    import subprocess
    system = platform.system()
    if system == 'linux':
        # 解析 /proc/net/route
        with open('/proc/net/route', 'r') as f:
            lines = f.readlines()[1:]  # 跳过标题行
            print("路由表 (linux):")
            for line in lines:
                parts = line.strip().split()
                if len(parts) >= 4:
                    iface = parts[0]
                    dest = int(parts[1], 16)
                    gateway = int(parts[2], 16)
                    # 转换 ip 格式
                    import socket, struct
                    dest_ip = socket.inet_ntoa(struct.pack('<l', dest))
                    gw_ip = socket.inet_ntoa(struct.pack('<l', gateway))
                    print(f"  {iface} -> 目标: {dest_ip}, 网关: {gw_ip}")
    elif system == 'windows':
        # 调用 route print 命令
        result = subprocess.run(['route', 'print'], capture_output=true, text=true)
        print(result.stdout)
    else:
        print("不支持的系统,请使用 netstat -rn 命令查看")
if __name__ == '__main__':
    get_gateways()
    get_routing_table()

注意:在 windows 上,netifaces.gateways() 可能返回空字典,需要管理员权限才能获取真实路由表。上面的 get_routing_table() 通过调用 route print 命令解决。

完整示例(跨平台)

以下代码整合了获取 mac/ip 以及路由信息(简单显示默认网关和部分路由):

import psutil
import netifaces
import socket
import platform
import subprocess
def get_network_interfaces():
    """返回所有活动网卡的名称、mac、ipv4"""
    interfaces = {}
    for iface, addrs in psutil.net_if_addrs().items():
        # 跳过常见虚拟/回环设备
        skip = ('lo', 'loopback', 'vethernet', 'docker', 'vboxnet', 'vmware', 'virtual')
        if iface.startswith(skip):
            continue
        mac = none
        ipv4 = none
        for addr in addrs:
            if addr.family == psutil.af_link:
                mac = addr.address
            elif addr.family == socket.af_inet:
                ipv4 = addr.address
        if mac or ipv4:
            interfaces[iface] = {'mac': mac, 'ipv4': ipv4}
    return interfaces
def get_default_gateway():
    """获取默认网关(跨平台)"""
    try:
        gateways = netifaces.gateways()
        default = gateways.get('default', {})
        if default:
            # 典型结构:{2: ('192.168.1.1', 'eth0')}
            for family, (gw, iface) in default.items():
                if family == socket.af_inet:
                    return gw, iface
    except exception:
        pass
    # 备选方案:调用系统命令
    system = platform.system()
    if system == 'windows':
        result = subprocess.run(['route', 'print', '0.0.0.0'], capture_output=true, text=true)
        # 简单解析(实际可以更严谨)
        for line in result.stdout.splitlines():
            if '0.0.0.0' in line and '255.255.255.0' in line:
                parts = line.split()
                if len(parts) >= 3:
                    return parts[2], parts[-1]
    elif system == 'linux':
        with open('/proc/net/route', 'r') as f:
            for line in f:
                parts = line.strip().split()
                if len(parts) >= 4 and parts[1] == '00000000':  # 目标 0.0.0.0
                    import struct, socket
                    gateway = socket.inet_ntoa(struct.pack('<l', int(parts[2], 16)))
                    return gateway, parts[0]
    return none, none
if __name__ == '__main__':
    print("=== 网卡信息 ===")
    ifaces = get_network_interfaces()
    for name, info in ifaces.items():
        print(f"{name}: mac={info['mac']}, ipv4={info['ipv4']}")
    print("\n=== 默认网关 ===")
    gw, iface = get_default_gateway()
    print(f"网关: {gw}, 网卡: {iface}")
    print("\n=== 完整路由表(简要) ===")
    # 直接调用系统路由表显示命令
    if platform.system() == 'windows':
        subprocess.run(['route', 'print'], shell=true)
    else:
        subprocess.run(['route', '-n'], shell=true)

注意事项

  • 权限问题:在 windows 上获取完整路由表可能需要以管理员身份运行 python 脚本。
  • 虚拟网卡:自动跳过了常见虚拟设备(如 docker、vmware),如需获取可删除 skip 判断。
  • ipv6 地址:上述代码只获取 ipv4,需要 ipv6 可增加 addr.family == socket.af_inet6 判断。
  • 跨平台psutil 和 netifaces 在 linux/windows/macos 上均可工作,但路由表解析部分需要区分系统。

到此这篇关于python实现获取本机网卡的mac地址,ip地址和路由表的文章就介绍到这了,更多相关python获取网卡mac地址内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com