最可靠方式是使用 ip link show 命令,因其兼容新旧内核、输出清晰且不混淆虚拟接口;MAC 地址位于 link/ether 行后,可配合 grep 精确提取。

用 ip 命令查 MAC 地址最可靠
Linux 下查网卡 MAC 地址,ip 是当前推荐方式,兼容新旧内核,输出结构清晰,不会混淆虚拟接口。
-
ip link show列出所有接口,MAC 地址在link/ether行后,例如:link/ether 00:1a:2b:3c:4d:5e brd ff:ff:ff:ff:ff:ff - 只查某张网卡(如
eth0):运行ip link show eth0 | grep "link/ether" - 注意过滤掉
lo(回环)、veth*(容器虚拟网卡)、docker0等非物理网卡 —— 它们的 MAC 不代表物理设备 - 某些系统启用 NetworkManager 后,
ip显示的可能是 NM 管理的逻辑名(如enp0s3),需结合lshw -class network确认是否对应真实网卡
ifconfig 还能用,但得装 net-tools
ifconfig 输出直观,但多数现代发行版(如 Ubuntu 22.04+、CentOS 8+)默认不预装 net-tools 包,直接运行会报 command not found。
- Debian/Ubuntu 上安装:
sudo apt install net-tools - CentOS/RHEL 上安装:
sudo yum install net-tools或sudo dnf install net-tools - 执行
ifconfig -a,找ether字段(不是inet或inet6) - 老脚本依赖
ifconfig的输出格式(如用awk '/ether/{print $2}'),迁移到ip时需改写为awk '/link\/ether/{print $2}'
从 sysfs 直接读取,适合脚本或无网络环境
物理网卡的 MAC 地址在内核启动时由驱动写入 /sys/class/net/*/address,该路径稳定、无需额外工具,且不依赖用户态网络服务。
- 查所有网卡 MAC:
for i in /sys/class/net/*; do n=$(basename $i); [ -f $i/address ] && echo "$n: $(cat $i/address)"; done - 只取真实以太网卡(排除
lo、wlan0等无线、虚拟设备):find /sys/class/net -maxdepth 1 -name 'en*' -exec basename {} \; -exec cat {}/address \; 2>/dev/null - 注意:
/sys/class/net/*/address对 root 可读,普通用户也能读;但某些嵌入式系统或精简内核可能禁用 sysfs 导出,此时会提示No such file or directory
别把 ethtool 当成万能查工具
ethtool 主要用于调试网卡驱动和链路状态,虽然能显示 MAC(ethtool -P eth0),但它有明显局限:
-
-P参数依赖驱动是否实现 “permanent address” 接口 —— 很多 Realtek、部分 Intel 千兆卡返回Permanent address: 00:00:00:00:00:00,实际是驱动未上报 -
ethtool eth0显示的Current message level等信息和 MAC 无关,容易误读 - 需要 root 权限才能调用部分 ioctl,普通用户执行可能失败
- 若网卡被
ip link set down关闭,ethtool仍可读 MAC;但若模块未加载(如rmmod r8169),则直接报No such device
lspci -k 和 ethtool -i 的 driver 字段比 address 更关键。










