为什么在Linux上PyUSB/libusb需要root(sudo)权限?
3 个回答
请查看我在这里给出的回答:
我该如何使用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
组。
你可以通过创建一个 udev 规则来改变你的 USB 设备的权限。
比如,我在 /etc/udev/rules.d/
这个文件夹里添加了以下一行:
SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0664", GROUP="usbusers"
这行代码把设备的拥有者设置为 root:usbusers
,而不是默认的 root:root
。
在我把自己加入 usbusers
这个组之后,就可以访问这个设备了。
libusb
是一个可以让你以各种方式操作USB设备的工具。比如说,你可以用它来格式化一个外接的USB硬盘。
一般来说,直接访问硬件是需要root
权限的。不过,我想其实不一定要完全的root
权限,只要有CAP_SYS_RAWIO
这个权限就可以了。