Почему PyUSB/libusb требует прав root (sudo) для Linux?

В последнее время я обсуждал с PyUSB и обнаружил, что он отлично работает на Linux (Ubuntu имеет libusb 0.1 и 1.0, а также OpenUSB)... но только если я запускаю программу с правами root (с sudo, конечно).

Может ли кто-нибудь сказать мне, почему для этого требуются повышенные привилегии и, что более важно, если я могу каким-то образом изменить права, чтобы заставить его работать для обычных учетных записей пользователей?

Ответ 1

libusb позволяет произвольно манипулировать произвольными USB-устройствами. Например, вы можете отформатировать внешний жесткий диск USB.

В общем, для всего прямого доступа к оборудованию требуются привилегии root, хотя я предполагаю, что на самом деле полные привилегии root не требуются, вы должны быть в порядке с помощью только CAP_SYS_RAWIO.

Ответ 2

Вы можете изменить разрешения своего устройства USB node, создав правило udev. например Я добавил следующую строку в файл в /etc/udev/rules.d/

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

Это устанавливает для владельца устройства node значение root:usbusers, а не root:root

После добавления себя в группу usbusers я могу получить доступ к устройству.

Ответ 3

См. ответ, который я дал здесь:
Как я могу общаться с этим устройством с помощью pyusb?

А именно:
Настройте файл правил udev для определенного устройства, к которому вы хотите, чтобы обычные пользователи могли получить доступ. Это определит идентификатор поставщика, идентификатор продукта и группу.
Идентификатор поставщика и продукта можно найти с помощью команды 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 смогут получить доступ к устройству.

EDIT: Обратите внимание, что в некоторых системах группа plugdev может не быть той группой, которая вам нужна. Он также может быть группой input в моем опыте, в зависимости от того, что вы подключаете.

Ответ 4

Существует более ранний ответ @rolf-of-saxony, который в значительной степени объясняет, как создать правило udev, но он рекомендует установить правило в неправильной папке. Мой ответ основан на этом, но не вписывается в структуру системных папок:

получить свой DeviceId vendorId, позвонив

lsusb

для мыши Logitech G203 и клавиатуры K120 это приводит к $

lsusb | grep Logitech
Bus 004 Device 003: ID 046d:c31c Logitech, Inc. Keyboard K120
Bus 003 Device 008: ID 046d:c084 Logitech, Inc.

Здесь: vendorID 046d для обоих USB-устройств. Идентификатор устройства мыши находится в c084

Теперь создайте правило в своем каталоге настроек /etc/udev/rules.d (отредактируйте idVendor и idProduct для вашего устройства!

sudo echo 'ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c084", MODE="660", GROUP="plugdev"' > /etc/udev/rules.d/90-logitechG203.rules

проверьте, что ваш пользователь находится в группе plugdev, вызывая

groups | grep plugdev

и добавьте своего пользователя в эту группу, если нет, вызывая

sudo adduser $USER plugdev

перезагрузить udev

sudo udevadm control --reload (that is minus minus reload)
sudo udevadm trigger

отключите и переустановите устройство, чтобы изменения вступили в силу.