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

Posted

技术标签:

【中文标题】为啥 PyUSB / libusb 在 Linux 上需要 root (sudo) 权限?【英文标题】:Why does PyUSB / libusb require root (sudo) permissions on Linux?为什么 PyUSB / libusb 在 Linux 上需要 root (sudo) 权限? 【发布时间】:2011-04-13 21:11:30 【问题描述】:

我最近一直在玩 PyUSB,发现它在 Linux 上运行良好(Ubuntu 有 libusb 0.1 和 1.0,以及 OpenUSB)...但前提是我运行程序时使用root 权限(当然是sudo)。

谁能告诉我为什么它需要提升权限,更重要的是,我能否以某种方式更改权限以使其适用于普通用户帐户?

【问题讨论】:

【参考方案1】:

查看我在这里给出的答案:How can I comunicate with this device using pyusb?

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

1。 创建一个udev规则文件

ACTION=="add", SUBSYSTEMS=="usb", ATTRSidVendor=="171b", ATTRSidProduct=="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 组,具体取决于您插入的内容。

【讨论】:

【参考方案2】:

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

SUBSYSTEM=="usb", ENVDEVTYPE=="usb_device", MODE="0664", GROUP="usbusers"

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

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

【讨论】:

酷...很快就会试一试!【参考方案3】:

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

一般来说,所有直接硬件访问都需要root 权限,虽然我猜实际上不需要完整的root 权限,你应该只需要CAP_SYS_RAWIO 就可以了。

【讨论】:

如何使用 PyUSB 设置 CAP_SYS_RAWIO? CAP_SYS_RAWIO 可以很容易地被用来获得完整的根,所以你不会通过使用该功能获得任何东西。

以上是关于为啥 PyUSB / libusb 在 Linux 上需要 root (sudo) 权限?的主要内容,如果未能解决你的问题,请参考以下文章

Windows 8.1 上的 Pyusb - 没有可用的后端 - 如何安装 libusb?

Windows 上的 Pyusb - 没有可用的后端

设备在 PyUSB 上不可用

PyUSB:从 USB 设备读取

PyUSB:为啥 bus.dirname 和 dev.filename 是空字符串?

为啥 Python pyusb usb.core 访问由于权限而被拒绝,为啥 rules.d 不能修复它?