You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:19:53