使用 udev-rules 在没有 sudo 的情况下调用 libusb

libusb calls without sudo using udev-rules

仅在 Kubuntu 16.04 64 位上测试。我有一个源不受我控制的应用程序。它使用一些 libusb 调用,最终以例如:

libusb: error [_get_usbfs_fd] libusb couldn't open USB device /dev/bus/usb/001/031: Permission denied
libusb: error [_get_usbfs_fd] libusb requires write access to USB device nodes.                                   

当运行 上述应用程序作为 root 时,它按预期工作。 当我更改相关文件的权限时:

sudo chmod a+w /dev/bus/usb/001/031

然后该应用程序将以标准用户权限运行(直到我断开/重新连接我的 USB 设备)。

现在我正在寻找一种方法,例如每次插入特定 USB 设备时自动执行 chmod a+w。 是否可以通过编写特定的 udev 规则来实现?

也许 libusb 在没有 root 权限的情况下调用了其他解决方案?

解决方案: 根据 David Grayson 的回答,我现在在我的规则文件中添加了带有 SUBSYSTEM=="usb" 的附加行。我的规则文件现在最终看起来像这样:

SUBSYSTEM=="tty", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", MODE="0666"
SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", MODE="0666"

假设 Kubuntu 16.04 使用 PolicyKit,将以下内容放入 /etc/udev/rules.d 中的文件中,命名方式与那里已经存在的文件类似:

ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="xxxx", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1"

将两组"xxxx"分别替换为设备的供应商ID和产品ID。

我建议您在 /etc/udev/rules.d 中添加一个名为 usb.rules 的新文件。它应该有以下内容:

SUBSYSTEM=="usb", MODE="0666"

这将使所有用户都可以读取和写入所有 USB 设备。

您还可以使用 Ignacio 的回答中提到的 idVendoridProduct 属性将其缩小到特定的 USB 设备。

老歌但金曲。帮助我解决与 AQEMU 下的虚拟机共享 USB 的问题。非常感谢。 我用这一行

添加到 /etc/udev/rules.d 文件 usb.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", MODE="0666"

并且虚拟机可以看到正在连接的U盘。