Python实现获取本机网卡的MAC地址,IP地址和路由表
一、获取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地址内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Win11平台安装和配置NeoVim0.8.2编辑器搭建Python3开发环境详细过程(2023最新攻略)
这篇文章主要介绍了Win11平台安装和配置NeoVim0.8.2编辑器搭建Python3开发环境(2023最新攻略),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-01-01


最新评论