Python读取Kali Linux MAC地址异常及修改失败求助
解决Python跨版本读取/修改Kali Linux MAC地址的问题
咱们一步一步拆解你遇到的两个核心问题,逐个解决:
1. 修复re.search返回匹配对象而非MAC字符串的问题
你的代码里有几个关键问题需要调整:
- Python3中
subprocess.check_output返回的是字节对象,但re.search需要字符串;Python2则直接返回字符串,所以得做跨版本兼容的解码处理 - 你直接返回了
re.search的匹配对象,而不是提取到的MAC字符串,必须用.group()方法获取实际匹配结果 - 正则表达式里的前后空格可能导致匹配失败,建议调整正则来适配
ifconfig的输出格式,不用依赖固定空格
修改后的get_current_mac函数:
import re import subprocess import sys def get_current_mac(interface): try: ifconfig_result = subprocess.check_output(["ifconfig", interface]) # 跨版本处理字节/字符串差异:Python3解码为字符串,Python2直接使用 if sys.version_info >= (3, 0): ifconfig_result = ifconfig_result.decode('utf-8') # 调整正则:精准匹配MAC地址格式,不依赖前后空格 mac_address_search_result = re.search(r'(\w\w:\w\w:\w\w:\w\w:\w\w:\w\w)', ifconfig_result) if mac_address_search_result: # 返回提取到的MAC字符串,而非匹配对象 return mac_address_search_result.group(1).strip() else: print("Could not read MAC Address") return None except subprocess.CalledProcessError: print(f"Error: Interface {interface} does not exist") return None
调用这个函数后,就能得到正常的MAC字符串,不会再出现<_sre.SRE_Match object>这类输出了。
2. 修复修改MAC地址时的SIOCSIFHWADDR错误
这个错误通常由以下几种原因导致,你可以逐一排查:
- 权限不足:修改MAC地址必须拥有root权限,一定要用
sudo运行你的Python脚本 - MAC地址格式不符合规范:MAC地址的第二个十六进制位必须是偶数(0、2、4、6、8、A、C、E),这是本地管理地址的强制要求。你尝试设置的
11:22:33:44:44:11中第一个字节是11,第二位是1(奇数),不符合规则,改成12:22:33:44:44:11或10:22:...这类格式试试 - 网卡不允许修改MAC:部分虚拟网卡或硬件网卡可能锁定了MAC地址,你可以先手动用命令行验证:
如果命令行也失败,说明网卡本身不支持修改;如果命令行成功,那是你的修改MAC的代码有问题,可以补充代码后再帮你排查sudo ifconfig eth0 down sudo ifconfig eth0 hw ether 12:22:33:44:44:11 sudo ifconfig eth0 up - 接口名称错误:确认你要修改的接口是
eth0还是其他(比如wlan0、ens33等),可以用ifconfig命令查看所有可用接口
跨版本兼容小提示
- 除了
subprocess.check_output的字节/字符串处理,建议统一用括号包裹print内容(你的代码已经做到了),这样在Python2和3中都能正常运行 - 如果后续用到更多
subprocess操作,跨版本可以考虑添加universal_newlines=True参数(Python3)来直接获取字符串输出
内容的提问来源于stack exchange,提问作者Guidiix
相关产品推荐
相关产品推荐

