¿Por qué PyUSB / libusb requieren de raíz (sudo) permisos en Linux?
Pregunta
He estado jugando un poco con PyUSB últimamente, y se encontró que funciona muy bien en Linux (Ubuntu tiene < a href = "http://www.libusb.org/" rel = "noreferrer"> libusb 0.1 y 1.0, así como OpenUSB ) ... pero sólo si corro el programa con privilegios de root (con sudo
, por supuesto).
Puede alguien decirme por qué se requiere privilegios elevados y, más importante, si puedo cambiar los permisos de alguna manera para hacer que funcione para las cuentas de usuario normales?
Solución
libusb
le permite manipular dispositivos USB arbitrarios en formas arbitrarias. Se podría formatear un disco duro USB externo, por ejemplo.
En general, todos los acceso directo al hardware requiere privilegios root
, aunque supongo que en realidad lleno root
no se requieren privilegios, que debe estar bien con sólo CAP_SYS_RAWIO
.
Otros consejos
Puede cambiar los permisos de su nodo de dispositivo USB mediante la creación de una regla udev.
p.ej. 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 para root:usbusers
en lugar de root:root
Después de la adición de mí mismo para el grupo usbusers
, puedo acceder al dispositivo.
Véase la respuesta que di aquí:
¿Cómo puedo comunicar con el dispositivo utilizando pyusb?
A saber:
Configurar un archivo de reglas udev para el dispositivo específico que desea que los usuarios normales para poder acceder. Esto va a definir el ID de proveedor, la identificación del producto y un grupo.
Los de proveedor y del producto se encuentran con el comando lsusb
.
1. Crear un archivo de reglas udev
ACTION=="add", SUBSYSTEMS=="usb", ATTRS{idVendor}=="171b", ATTRS{idProduct}=="2001", MODE="660", GROUP="plugdev"
Ponga esto en un archivo llamado (por ejemplo) /lib/udev/rules.d/50-YourSoftwareName.rules (cavar alrededor de udev hombre por las reglas de nomenclatura de archivos)
NOTA: La convención de nomenclatura antigua /etc/udev/rules.d/filename.rules utilizado, que ha cambiado.
2. añadir los nombres de usuario al grupo plugdev
adduser username plugdev
3. obligar al sistema udev para ver los cambios
sudo udevadm control --reload
(que es de menos de menos de recarga)
sudo udevadm trigger
4. desenchufe y vuelva a conectar el dispositivo o reiniciar la máquina
El resultado final debe ser que todos los miembros del grupo plugdev ahora podrán acceder al dispositivo.
EDIT:
Tenga en cuenta que en algunos sistemas la plugdev
grupo no puede ser el grupo que necesita. También puede ser el grupo input
en mi experiencia, dependiendo de lo que está conectando en.