
1. 问题现象UOS/Linux 连接 Android 手机后执行adb devices可能显示List of devices attached 774caac6 no permissions (user in plugdev group; are your udev rules wrong?)此时手机通常不会弹出 USB 调试授权窗口因为 Linux 用户尚未获得访问 USB 设备节点的权限ADB 还没有机会和手机建立授权连接。2. 原因分析使用lsusb查看 USB 设备Bus 002 Device 021: ID 22d9:2769 OnePlus22d9厂商 ID即idVendor。2769产品 ID即idProduct。如果设备节点如下即使用户属于plugdev组也无法通过该组访问设备crw-rw-r-- 1 root root ... /dev/bus/usb/002/021确认用户组id groups3. 推荐修复方法不建议直接修改/lib/udev/rules.d/51-android.rules。该文件由系统软件包维护系统升级后手工修改可能被覆盖。推荐在/etc/udev/rules.d/创建本机自定义规则。3.1 严格匹配当前 VID 和 PIDsudo nano /etc/udev/rules.d/60-android-oneplus.rules写入SUBSYSTEMusb, ATTR{idVendor}22d9, ATTR{idProduct}2769, MODE0660, GROUPplugdev, TAGuaccess该规则只匹配22d9:2769权限范围较小。3.2 匹配同一厂商的全部 USB 产品SUBSYSTEMusb, ATTR{idVendor}22d9, MODE0660, GROUPplugdev, TAGuaccess该规则可兼容同厂商不同手机和不同 USB 模式但会授权所有idVendor22d9的 USB 产品。4. VID/PID 匹配范围写法匹配范围优点缺点仅 VID同一厂商的全部 USB 产品兼容不同型号及 USB 模式授权范围较大VID PID指定的设备产品组合权限范围小PID 改变后可能再次无权限手机检测或取证专用的受控环境可以只匹配 VID维护更方便。多人共用或需要严格控制权限使用 VIDPID。推荐MODE0660配合GROUPplugdev不建议使用面向所有用户的0666。5. udev 规则文件命名文件名可以自定义建议采用数字-用途.rules60-android-oneplus.rules 60-android-adb.rules 70-local-android.rules 99-local-adb.rules必须以.rules结尾。建议只使用英文字母、数字、短横线和下划线。文件按名称排序处理开头数字会影响加载顺序。50-70常用于设备权限规则80-99常用于本机最终覆盖规则。真正决定匹配哪个设备的是规则内容不是文件名。6. 重载规则并验证sudo udevadm control --reload-rules sudo udevadm trigger adb kill-server adb start-server adb devices -l更稳妥的方式是重载规则后拔掉 USB 线再重新连接。检查节点ls -l /dev/bus/usb/002/021修复后应类似crw-rw---- 1 root plugdev ... /dev/bus/usb/002/021ADB 首次取得权限后可能显示unauthorized此时解锁手机并确认 RSA 授权。成功后显示774caac6 device如果直接显示device说明这台电脑的 ADB 密钥以前已经被手机授权。7. Windows 上查看 VID/PID在设备管理器的设备属性中选择“详细信息 → 硬件 ID”例如USB\VID_22D9PID_2769MI_01对应 Linux udev 属性ATTR{idVendor}22d9 ATTR{idProduct}2769也可以在 PowerShell 中查看Get-PnpDevice -PresentOnly | Where-Object InstanceId -Like USB\VID_* | Select-Object Status, Class, FriendlyName, InstanceIdMODE0660是 Linux 设备节点权限Windows 没有 udev 和 MODE 概念因此无需也无法从 Windows 查询。8. USB 模式变化与动态设备节点同一台手机在不同 USB 模式下可能使用不同的 VID/PID。例如当前设备可能显示Bus 002 Device 023: ID 18d1:4ee7 Google Inc.Bus002Device023idVendor18d1idProduct4ee7当前设备节点/dev/bus/usb/002/023手机虽然可能是 OnePlus但在当前 ADB/MTP 模式下使用了 Google 的 USB 厂商 ID18d1。重新插拔或切换 USB 模式后它可能重新使用 OnePlus 的22d9。8.1 确认当前节点权限ls -l /dev/bus/usb/002/023如果显示类似下面的结果说明节点属于root:root普通用户没有 ADB 所需的读写权限crw-rw-r-- 1 root root ... /dev/bus/usb/002/0238.2 同时支持 Google 和 OnePlus VID创建本机规则sudo tee /etc/udev/rules.d/51-android-local.rules /dev/null EOF SUBSYSTEMusb, ATTR{idVendor}18d1, MODE0660, GROUPplugdev, TAGuaccess SUBSYSTEMusb, ATTR{idVendor}22d9, MODE0660, GROUPplugdev, TAGuaccess EOF重新加载规则sudo chmod 644 /etc/udev/rules.d/51-android-local.rules sudo udevadm control --reload-rules sudo udevadm trigger上述规则按厂商 ID 授权能够兼容 PID 和 USB 模式变化但匹配范围大于 VIDPID。多人共用或权限要求严格的机器应按实际 PID 分别添加精确规则。8.3 确认 plugdev 用户组id -nG如果输出中没有plugdev执行sudo usermod -aG plugdev $USER加入用户组后需要注销系统并重新登录现有登录会话不会自动获得新组权限。8.4 重新连接并动态查找节点拔掉手机保持手机解锁后重新连接。Device 编号可能从023变成024应重新查询lsusb -d 18d1: lsusb -d 22d9:也可以根据当前 VID/PID 自动生成设备节点路径usb_node$(lsusb -d 18d1:4ee7 | awk {gsub(:, , $4); print /dev/bus/usb/ $2 / $4}) echo $usb_node ls -l $usb_node权限修复后应类似crw-rw---- 1 root plugdev ... /dev/bus/usb/002/0238.5 重启 ADB 并完成手机授权adb kill-server adb start-server adb devices第一次正常访问设备时可能显示774caac6 unauthorized此时手机才会弹出 RSA 授权窗口点击允许后变为774caac6 device不要长期使用固定节点/dev/bus/usb/002/021或/dev/bus/usb/002/023。USB 每次重新连接时 Device 编号都可能变化udev 规则必须匹配稳定的 VID/PID而不是 Bus/Device 编号。9. 撤销规则根据实际创建的文件删除对应规则sudo rm -f /etc/udev/rules.d/60-android-oneplus.rules sudo rm -f /etc/udev/rules.d/51-android-local.rules sudo udevadm control --reload-rules sudo udevadm trigger随后拔插 USB 设备使设备节点按照剩余规则重新生成。适用范围UOS/Linux 上通过 ADB 访问 Android USB 设备。