如何在Termux中可靠获取WiFi硬件(MAC)地址?
安卓Termux环境下可靠提取WiFi硬件MAC地址的方案
你提到的正则解析ip link输出的问题很常见——不同设备、安卓版本的ip命令输出格式可能有细微差异,导致依赖正则分割的代码很容易失效。下面给你几个更稳定的系统级提取方法,涵盖Bash和Python实现,避开正则依赖的坑:
Bash 实现(简单直接)
方案1:利用ip命令的精准输出参数
ip命令本身支持格式化输出,不用自己写复杂正则匹配:
ip -o link show wlan0 | awk '/ether/ {print $2}' | tr '[:upper:]' '[:lower:]'
-o参数让ip输出每行对应一个网络接口,避免多行拆分的问题awk直接定位包含ether的行,提取第二个字段就是MAC地址tr把地址转成小写(可选,根据你的需求调整)
方案2:读取系统sysfs文件(最可靠)
安卓系统会把网络接口的硬件地址存在/sys/class/net/目录下的对应文件里,直接读取这个文件是最稳定的方式,完全不依赖命令输出格式:
cat /sys/class/net/wlan0/address | tr '[:upper:]' '[:lower:]'
如果你的设备WiFi接口不是wlan0(比如部分设备是wlan1),可以先执行ls /sys/class/net/查看所有网络接口名,替换成对应的即可。
Python 实现(适配你的开发场景)
方案1:调用ip命令的精准输出
对应上面的Bash方案,用Python封装更适合你的脚本场景:
import subprocess def get_wifi_mac(): try: # 直接指定查看wlan0接口,单行输出模式 result = subprocess.run( ['ip', '-o', 'link', 'show', 'wlan0'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) result.check_returncode() # 确保命令执行成功 # 遍历输出行,提取MAC地址 for line in result.stdout.splitlines(): parts = line.split() if 'ether' in parts: mac_address = parts[parts.index('ether') + 1] return mac_address.lower() raise RuntimeError("未找到wlan0接口的MAC地址") except subprocess.CalledProcessError as e: raise RuntimeError(f"获取接口信息失败: {e.stderr.strip()}") from e
方案2:读取sysfs文件(稳定性拉满)
这是最推荐的方法,完全不依赖外部命令,直接读取系统文件:
def get_wifi_mac_sysfs(): # 常见的WiFi接口名列表,可根据实际情况扩展 possible_interfaces = ['wlan0', 'wlan1'] for iface in possible_interfaces: file_path = f'/sys/class/net/{iface}/address' try: with open(file_path, 'r') as f: return f.read().strip().lower() except FileNotFoundError: continue except PermissionError: raise RuntimeError(f"没有权限读取{file_path}文件") raise RuntimeError(f"未找到WiFi接口(已尝试: {', '.join(possible_interfaces)})")
关于termux-wifi-connectioninfo返回02:00:00:00:00:00的说明
这是安卓10及以上版本的隐私限制导致的:系统禁止非系统级应用获取真实的WiFi硬件MAC地址,Termux作为普通应用,调用这个API只能拿到这个占位符地址,所以无法通过这个方法获取真实的硬件MAC。
内容的提问来源于stack exchange,提问作者CPBL
相关产品推荐
相关产品推荐

