如何允许软件访问任何 USB 设备?

如何允许软件访问任何 USB 设备?

我有一个基于 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*)。

您应该寻找它们属性中的相似之处。

  1. 删除所有这些设备
  2. 保存当前设备列表/dev

    ls /dev > /tmp/dev_list0.txt
    
  3. 插入其中一个目标设备

  4. 将设备列表保存在另一个文件中

    ls /dev > /tmp/dev_list.txt
    
  5. 比较文件、>添加设备、<删除设备

    $ colordiff /tmp/dev_list0.txt /tmp/dev_list.txt
    85a86,87
    > sdc
    > serial
    89a92,93
    > sg4
    > sg5
    93a98
    > sr1
    194a200,201
    > ttyUSB0
    > ttyUSB1
    

    这是一个3G调制解调器。

  6. 检查您需要的所有接口的属性,例如:

    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/

相关内容