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
相关推荐
Michaelwubo8 分钟前
mysql8 主从 HA切换
android·adb
91刘仁德17 小时前
MYSQL 事务原理及使用
android·mysql·adb
笑梦无境3 天前
mysql的安装及配置(3)
数据库·mysql·adb
!chen3 天前
数据库主从有延迟怎么处理
数据库·adb
2501_915106325 天前
安卓抓包软件2026,免证书抓包 应用层抓包 代理抓包全解析
网络协议·计算机网络·网络安全·ios·adb·https·udp
ymwlchina5 天前
华为手机P40 Plus如何通过adb无线连接
adb·华为·智能手机
00后程序员张6 天前
Android证书绑定抓包失败?Android SSL Pinning绕过实战指南
android·网络协议·计算机网络·网络安全·adb·https·ssl
九皇叔叔8 天前
MySQL ORDER BY 性能优化详解:Using filesort、联合索引、ASC/DESC 与覆盖索引
android·adb
firstacui9 天前
Mysql调优
android·mysql·adb