遇到的问题
手机通过 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