Почему 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
отключите и переустановите устройство, чтобы изменения вступили в силу.