USB 网络共享 + adb 无权限问题排查

遇到的问题

手机通过 USB 连接电脑,想用手机 USB 网络共享给电脑,同时 adb devices 报错:

复制代码
List of devices attached
3927100152	no permissions (missing udev rules? user is in the plugdev group)

分析

1. USB 网络共享其实已经正常工作

与 adb 报错是两件独立的事,不要混在一起排查:

  • 内核识别出 CDC NCM 网卡:cdc_ncm 1-1:1.1 enp0s20f0u1i1
  • 网卡拿到 DHCP 地址 10.164.255.88/24,默认路由经手机 10.164.255.79(metric 100,比 WiFi 的 600 优先级高)
  • ping 223.5.5.5 通,延迟 ~54ms

网络共享部分没有故障,是 adb 的权限问题被当成网络问题在排查。

2. adb 报错的根因:设备节点权限

USB 设备节点权限:

复制代码
crw-rw-r-- 1 root root 189, 28 /dev/bus/usb/001/029
  • 属主 root:root,模式 644
  • 当前用户虽然在 plugdev 组,但节点组的属主是 root,普通用户只有 r--,打不开

系统的 udev 规则(/etc/udev/rules.d/)里只有 snap 的规则,没有 android/adb 的规则,所以内核创建节点时不会自动把组设成 plugdev 或放 0666 权限。

3. 原理

adb 通过 Linux USB 文件系统(/dev/bus/usb/<bus>/<dev>)直接访问 USB 设备,需要对该节点有读写权限。

udev 在设备枚举时按规则匹配 SUBSYSTEM/ATTR{idVendor} 等属性,可以修改节点的属主、属组和权限模式。没有匹配规则时走默认(root:root),非 root 用户无权限访问。

处理方法

新建 /etc/udev/rules.d/51-android.rules:

复制代码
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"
  • 18d1 是 Google(Pixel)的 USB Vendor ID,lsusb 里能看到
  • 只匹配 Google 设备,其他厂商手机不受影响
  • 重载 udev 让规则立即生效,无需重启
bash 复制代码
sudo udevadm control --reload
sudo udevadm trigger
sudo udevadm settle

之后 adb kill-server && adb devices 正常。

注意事项

  • 规则写在 /etc/udev/rules.d/ 是持久化的,重启后依然生效
  • 换其他厂商手机时 idVendor 不匹配会再次无权限(小米/一加 2717、三星 04e8);可改成 ATTR{idVendor}=="18d1|2717|04e8",或直接 MODE="0666"(所有 USB 设备可读写,权限放得更宽)
  • 若还是无权限,先 sudo udevadm test /sys/bus/usb/devices/1-1 看规则是否匹配,确认节点变成 plugdev 组或 0666

修复脚本

写规则 → 重载 udev → 查节点权限 → 重启 adb server → 打印 adb devices。

adb_auth.sh

复制代码
#!/usr/bin/env bash
set -euo pipefail

RULE_FILE=/etc/udev/rules.d/51-android.rules
VENDOR_ID=18d1

if [ "$(id -u)" -ne 0 ]; then
    echo "需要 root 权限,请用 sudo 运行: sudo $0"
    exit 1
fi

echo "写入 udev 规则: $RULE_FILE"
tee "$RULE_FILE" >/dev/null <<EOF
SUBSYSTEM=="usb", ATTR{idVendor}=="$VENDOR_ID", MODE="0666", GROUP="plugdev"
EOF

echo "重载 udev 规则"
udevadm control --reload
udevadm trigger
udevadm settle

echo "当前 adb 设备节点权限:"
for node in /dev/bus/usb/*/*; do
    ls -l "$node"
done

echo "重启 adb server"
pkill -f "adb.*server" 2>/dev/null || true
adb kill-server 2>/dev/null || true
adb start-server 2>/dev/null || true

echo "---"
adb devices
相关推荐
蒸鱼Yuzheng6 小时前
设备端性能工件可靠导出:断点续传、哈希、manifest 与失败恢复
android·自动化测试·python·adb·数据完整性
文人sec9 天前
grant 之后要跟着 flush privileges 吗?要不要使用分区表?
数据库·mysql·adb·数据分析
2501_9160088910 天前
SSE 和 gRPC 流式接口如何抓包,调试 SSE 与 gRPC 流式接口
网络协议·计算机网络·网络安全·ios·adb·https·udp
2501_9160088913 天前
全平台抓包工具,Windows、iPhone、Linux三个平台抓包测试
网络协议·计算机网络·网络安全·ios·adb·https·udp
鸽芷咕15 天前
MySQL Server 鸿蒙 PC 适配全记录:以混合工具链完成 C++23 交叉编译与 HNP 交付
adb·harmonyos·c++23
游戏开发爱好者817 天前
网络连接排查指南,谁在电脑后台偷跑流量,哪些程序在联网
网络协议·计算机网络·网络安全·ios·adb·https·udp
实心儿儿17 天前
MySQL 的安装
数据库·mysql·adb
2601_9623004718 天前
基于Python与Tkinter的ADB Monkey自动化测试脚本开发
python·adb·tkinter·android测试·gui自动化
flower_drop19 天前
基于 WebUSB 与 CDP:在浏览器端实现 Android 设备通信与无证书抓包实践
android·chrome·测试工具·adb·bug·edge浏览器
蜡台20 天前
# 已解决|MySQL 8\.4\.11 密码正确仍报错1045 \(28000\) Access denied 终极修复方案
android·mysql·adb