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

12 投票
3 回答
15116 浏览
提问于 2025-04-16 04:17

最近我在玩 PyUSB,发现它在Linux上运行得非常好(Ubuntu有 libusb 0.1和1.0,还有 OpenUSB)……但前提是我得用管理员权限来运行这个程序(当然是用 sudo)。

有没有人能告诉我为什么它需要更高的权限?更重要的是,我能不能通过某种方式来改变权限,让普通用户也能使用它?

3 个回答

12

请查看我在这里给出的回答:
我该如何使用pyusb与这个设备通信?

具体来说:
你需要为你想让普通用户能够访问的特定设备设置一个udev规则文件。这个文件会定义设备的供应商ID、产品ID和一个组。
你可以通过使用lsusb命令来找到供应商和产品ID。

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(注意是两个减号reload)
sudo udevadm trigger

4. 拔掉设备再插上,或者重启你的电脑

最终的结果是,plugdev组的所有成员现在都可以访问这个设备。

编辑:
请注意,在某些系统上,plugdev组可能不是你需要的组。根据你插入的设备不同,可能还会是input组。

14

你可以通过创建一个 udev 规则来改变你的 USB 设备的权限。

比如,我在 /etc/udev/rules.d/ 这个文件夹里添加了以下一行:

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

这行代码把设备的拥有者设置为 root:usbusers,而不是默认的 root:root

在我把自己加入 usbusers 这个组之后,就可以访问这个设备了。

6

libusb 是一个可以让你以各种方式操作USB设备的工具。比如说,你可以用它来格式化一个外接的USB硬盘。

一般来说,直接访问硬件是需要root权限的。不过,我想其实不一定要完全的root权限,只要有CAP_SYS_RAWIO这个权限就可以了。

撰写回答