2010-09-17 9 views
10

He estado jugando con PyUSB últimamente, y encontré que funciona muy bien en Linux (Ubuntu tiene libusb 0.1 y 1.0, así como OpenUSB) ... pero solo si ejecuto el programa con privilegios de administrador (con sudo, de curso).¿Por qué PyUSB/libusb requiere permisos de root (sudo) en Linux?

¿Alguien puede decirme por qué se requieren privilegios elevados y, más importante aún, si puedo cambiar los permisos de alguna manera para que funcione para cuentas de usuario normales?

Respuesta

5

libusb le permite manipular dispositivos USB arbitrarios de formas arbitrarias. Puede formatear un disco duro USB externo, por ejemplo.

En general, todo el acceso directo al hardware requiere de privilegios root, aunque supongo que en realidad los privilegios completos de root no son necesarios, debe estar bien con solo CAP_SYS_RAWIO.

+0

Eso tiene mucho sentido. Voy a intentarlo ... – ewall

+0

¿Cómo configuro CAP_SYS_RAWIO con PyUSB? – jedierikb

+0

'CAP_SYS_RAWIO' se puede aprovechar trivialmente para obtener una raíz completa, por lo que no se gana nada utilizando esa capacidad. – caf

10

Puede cambiar los permisos de su nodo de dispositivo usb creando una regla udev. p. He añadido la siguiente línea en un archivo en /etc/udev/rules.d/

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

Esto establece el propietario del nodo de dispositivo a root:usbusers en lugar de root:root

Después de la adición de mí mismo para el grupo usbusers, puedo acceder al dispositivo.

+0

Cool ... lo probaré pronto! – ewall

1

ver la respuesta que di aquí:
How can I comunicate with this device using pyusb?

A saber:
Establecer un archivo de reglas udev para el dispositivo específico que desea que los usuarios normales para poder acceder. Esto definirá la identificación del proveedor, la identificación del producto y un grupo.
El vendedor y las identificaciones del producto se pueden encontrar utilizando el comando lsusb.

1. Crear un archivo de reglas udev

ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="171b", ATTRS{idProduct}=="2001", MODE="660", GROUP="plugdev" 

Pon esto en un archivo llamado (por ejemplo) /lib/udev/rules.d/50-YourSoftwareName.rules (cavar a su alrededor en el hombre udev reglas de nombres de archivos)
NOTA: La antigua convención de nombres usaba /etc/udev/rules.d/filename.rules, que ha cambiado.

2. añadir los nombres de usuario al grupo plugdev

adduser username plugdev

3. vigor el sistema udev para ver los cambios

sudo udevadm control --reload (es decir, menos de menos de recarga)
sudo udevadm trigger

4. desenchufe y vuelva a enchufar la devi ce o reinicie su máquina

El resultado final debería ser que todos los miembros del grupo plugdev ahora podrán acceder al dispositivo.

EDITAR: Tenga en cuenta que en algunos sistemas, el grupo plugdev puede no ser el grupo que necesita. También puede ser el grupo input en mi experiencia, dependiendo de lo que está conectando.

1

Hay una respuesta anterior de @ rolf-of-saxony que explica cómo crear una regla udev pero recomienda instalar la regla en la carpeta incorrecta. Mi respuesta se basa en eso, pero does not mess with the systems folder structure:

obtener su deviceId vendorID llamando

lsusb 

para un teclado Logitech G203 Mouse y K120 esto se traduce en $

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

aquí: vendorID es 046d para ambos dispositivos usb. El ratón deviceID está en c084

Ahora crear la regla en el directorio de configuración /etc/udev/rules.d (editar el idVendor y idProduct para su dispositivo!

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

comprobación de que su usuario está en el grupo plugdev llamando

groups | grep plugdev 

y añadir su usuario a ese grupo si no, llamando

sudo adduser $USER plugdev 

recarga udev

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

desconecte y reconecte el dispositivo para que los cambios surtan efecto.

Cuestiones relacionadas