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
相关推荐
王琦031811 小时前
第二章 MySQL集群高可用架构
mysql·adb·架构
深念Y14 小时前
hotspot-adb-research
linux·数据库·adb·emmc·随身wifi·移动终端
小Ti客栈1 天前
MySQL查询原理:从Server到InnoDB
android·mysql·adb
深念Y2 天前
老Flyme 官方 root 开启 ADB TCP 方案
linux·数据库·网络协议·tcp/ip·adb·智能手机·emmc
00后程序员张2 天前
抓包鹰 电脑本机网络连接表怎么看?哪些程序在联网 进程归属与可疑 IP 追溯
网络协议·计算机网络·网络安全·ios·adb·https·udp
OceanWaves19932 天前
mysql 5.7.29 主从同步配置
数据库·mysql·adb
九皇叔叔3 天前
RHEL9 安装 MySQL 8.4.11.LTS 版本
android·mysql·adb
灵析表格3 天前
Excel连接MySQL的函数化革命:灵析表格MySQL函数族业务应用分析
数据库·mysql·adb·excel·wps·灵析表格·excel公式盒子
王琦03183 天前
mysql基础
android·mysql·adb