使用 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 的回答中提到的 idVendor
和 idProduct
属性将其缩小到特定的 USB 设备。
老歌但金曲。帮助我解决与 AQEMU 下的虚拟机共享 USB 的问题。非常感谢。
我用这一行
添加到 /etc/udev/rules.d
文件 usb.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", MODE="0666"
并且虚拟机可以看到正在连接的U盘。
仅在 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 的回答中提到的 idVendor
和 idProduct
属性将其缩小到特定的 USB 设备。
老歌但金曲。帮助我解决与 AQEMU 下的虚拟机共享 USB 的问题。非常感谢。 我用这一行
添加到/etc/udev/rules.d
文件 usb.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", MODE="0666"
并且虚拟机可以看到正在连接的U盘。