2010-09-17 5 views
10

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

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

ответ

5

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

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

+0

Это имеет большой смысл. Я дам ему попробовать ... – ewall

+0

Как установить CAP_SYS_RAWIO с PyUSB? – jedierikb

+0

'CAP_SYS_RAWIO' можно трижды использовать для получения полного корня, поэтому вы ничего не получите, используя эту возможность. – caf

10

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

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

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

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

+0

Прохладный ... попробует скоро! – ewall

1

Смотрите ответ, который я дал здесь:
How can I comunicate with this device using 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 (копаться в человеке Udev для правила именования файлов)
ПРИМЕЧАНИЕ. В старом соглашении об именах использовался /etc/udev/rules.d/filename.rules, который изменился.

2. добавить имена пользователей в plugdev группе

adduser username plugdev

3. силы системы Udev, чтобы увидеть ваши изменения

sudo udevadm control --reload (то есть минус минус перезарядка)
sudo udevadm trigger

4. отключите и снова отпустите devi ce или перезагрузите машину

Конечный результат должен состоять в том, что теперь все члены группового plugdev смогут получить доступ к устройству.

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

1

Существует более ранний ответ @ rolf-of-saxony, который в значительной степени объясняет, как создать правило udev, но он рекомендует установить правило в неправильной папке. Мой ответ основан на том, что, но does not mess with the systems folder structure:

получить 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-устройств. Мышь DeviceId находится в 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 

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