![如何允许软件访问任何 USB 设备?](https://linux22.com/image/1125011/%E5%A6%82%E4%BD%95%E5%85%81%E8%AE%B8%E8%BD%AF%E4%BB%B6%E8%AE%BF%E9%97%AE%E4%BB%BB%E4%BD%95%20USB%20%E8%AE%BE%E5%A4%87%EF%BC%9F.png)
我有一个基于 libusb 的程序,由于缺少权限,无法在新安装的 Ubuntu 上打开 USB 设备。
此解决方案对我来说可能有用,但它需要手动指定每个设备 - 而我有不少设备。所以我尝试了这个(在文件中/etc/udev/rules.d/41-cvs-permissions.rules
):
SUBSYSTEM=="usb", MODE:="0666"
我省略了 VID 和 PID,希望它能简单地将规则应用于所有设备。它确实有一些效果,但效果相当奇怪:libusb 现在只检测到 2 个无法打开的设备,而不是 5 个 - 两者都是 USB 主机控制器,而不是实际设备。
如何实现我的愿望?
答案1
我处理 USB 设备的方式是让特定组访问所有 USB 设备。
以 root 身份:
echo 'SUBSYSTEM=="usb", MODE="0660", GROUP="plugdev"' > /etc/udev/rules.d/00-usb-permissions.rules
udevadm control --reload-rules
本质上,这样做就是向 plugdev 组的成员授予任何 usb 设备的读写访问权限。
答案2
我同意使用 VID/PID 进行规则匹配并不是一个明确的解决方案。但您可以在同一个规则中匹配多个设备,而不必像以前那样盲目地将所有 USB 设备作为目标。例如,使用DRIVER
名称 ( usb-storage
, usbhid
,..) 或KERNEL
名称 ( tty*
, sd*
,..) 甚至使用最小正则表达式 ( sd[a-z][0-9]*
, usb*
)。
您应该寻找它们属性中的相似之处。
- 删除所有这些设备
保存当前设备列表
/dev
ls /dev > /tmp/dev_list0.txt
插入其中一个目标设备
将设备列表保存在另一个文件中
ls /dev > /tmp/dev_list.txt
比较文件、
>
添加设备、<
删除设备$ colordiff /tmp/dev_list0.txt /tmp/dev_list.txt 85a86,87 > sdc > serial 89a92,93 > sg4 > sg5 93a98 > sr1 194a200,201 > ttyUSB0 > ttyUSB1
这是一个3G调制解调器。
检查您需要的所有接口的属性,例如:
udevadm info --attribute-walk --name=/dev/ttyUSB0
对您想要的所有设备执行相同操作。如果您不知道如何操作,请上传它们的udevadm info --attribute-walk --name=...
输出并将其链接到您的问题。
请注意,并非所有 USB 设备都会在 中创建节点/dev
。有些设备需要在 SYSFS 树中查找/sys
。然后使用以下方法检查它们的属性:--path
udevadm info --attribute-walk --path=...
使用与上述相同的步骤,您可以检查通过监视udev
事件创建了哪些设备节点:
udevadm monitor
答案3
这是解锁硬件访问权限的最简单的解决方案:
sudo chmod -R 777 /dev/bus/usb/