为什么在Linux上使用PyUSB/libusb需要root(sudo)权限?

11

最近我一直在试用 PyUSB ,发现它在Linux系统下(Ubuntu有libusb0.1 和 1.0, 以及OpenUSB)表现非常好,但是只有在使用root权限(当然要用sudo)运行程序时才能正常工作。

有人可以告诉我为什么它需要提升权限,并且更重要的是,是否可以改变权限让它在普通用户账户下工作?

3个回答

14

您可以通过创建一个udev规则来更改USB设备节点的权限。例如,我将以下行添加到/etc/udev/rules.d/文件中:

SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0664", GROUP="usbusers"

这将把设备节点的所有者设置为 root:usbusers 而不是 root:root

将自己添加到 usbusers 组后,即可访问设备。


很酷,我很快会尝试! - ewall

11

请查看我在此处的回答:
如何使用 pyusb 与此设备通信?

即:
为您想要普通用户能够访问的特定设备设置 udev 规则文件。 这将定义供应商 ID、产品 ID 和组。
供应商和产品 ID 可以使用 lsusb 命令找到。

1. 创建一个 udev 规则文件

ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="171b", ATTRS{idProduct}=="2001", MODE="660", GROUP="plugdev"

将以下内容放入名为(例如)/lib/udev/rules.d/50-YourSoftwareName.rules的文件中(在man udev中查找文件命名规则)
注意:旧的命名约定使用/etc/udev/rules.d/filename.rules,已更改。

2. 将用户名称添加到plugdev组中

adduser username plugdev

3. 强制udev系统看到您的更改

sudo udevadm control --reload(即减号减号重新加载)
sudo udevadm trigger

4. 拔出并重新插入设备 或者 重新启动计算机

最终结果应该是插入plugdev组的所有成员现在都可以访问该设备。

编辑: 请注意,在某些系统上,组plugdev可能不是您所需的组。根据我的经验,也可以是组input,具体取决于您插入的内容。


6

libusb允许您以任意方式操作任意USB设备。例如,您可以格式化外部USB硬盘。

一般来说,所有直接的硬件访问都需要root权限,尽管我猜实际上并不需要完全的root权限,只要有CAP_SYS_RAWIO就行了。


1
如何使用PyUSB设置CAP_SYS_RAWIO? - jedierikb
CAP_SYS_RAWIO 可以轻松地被利用来获得完整的 root 权限,因此使用该能力并不能带来任何好处。 - caf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接