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
相关推荐
misty youth2 天前
Navicat与PHPstudy小皮
mysql·adb·php·navicat
for_ever_love__3 天前
MySQL 8.0 数据类型选型指南:INT、DECIMAL、VARCHAR 与时间字段怎么选
mysql·adb·数据类型·varchar·长度·字段类型选择
yeflx4 天前
Ubuntu22.04安装Mysql Workbench
数据库·mysql·adb
夜雪一千4 天前
MySQL 自增 ID 的底层原理与坑点
android·mysql·adb
Dxy12393102165 天前
MySQL JSON 生成列索引原理、实战与坑点
mysql·adb·json
远方 hi5 天前
MySQL 管理
adb
夜雪一千6 天前
MySQL 删除 JSON 类型的数据实战
mysql·adb·json
千码君20167 天前
个人开发者:安卓手机adb调试
android·adb·智能手机
夜雪一千8 天前
MySQL 如何存储经纬度坐标:选型、建表、空间查询实战
android·mysql·adb