¿Cómo hago para que libusb funcione como no root?

¿Cómo hago para que libusb funcione como no root?

Estoy creando un dispositivo USB HID personalizado y una aplicación de escritorio para acompañarlo, usando HIDAPI en Lubuntu 16.04.3 LTS. Lo llamaremos myapppor ahora.

Al parecer, si lo hago $ ./myapp, libusb_open()falla con LIBUSB_ERROR_ACCESS. (se muestra en mi depurador como -3; me tomó un tiempo descubrirlo porque la enumeración no parece estar muy bien documentada)
Pero si lo hago $ sudo ./myapp, tiene éxito.
Realmente no quiero myapptener permisos de root, entonces, ¿cómo puedo hablar con mi dispositivo USB sin ellos?


esperaba una respuestaaquí, pero parece haber sido abandonado exactamente en este punto. Dice algo sobre los permisos de usuario, pero parece que no puedo encontrarlo en mi sistema. Pensé que podría encontrar un grupo llamado usbo libusbal que podría agregarme, pero no tuve suerte.


Esta pregunta en un sitio SE diferentetiene una respuesta que utiliza algunos archivos de texto austeros para cambiar los permisos ya sea globalmente (probablemente una mala idea) o para un dispositivo específico, pero:

  1. No es el "ajuste muggle" que estaba buscando.
  2. La mayoría de esos archivos tienen una advertencia contra la modificación directa porque se generan automáticamente. Entonces, ¿cómo puedo estar seguro de que una actualización aleatoria del paquete no borrará mis cambios y, por lo tanto, no se romperá myapp?
  3. De todos modos, no parece hacer nada. Seguí esas instrucciones y reinicié, y myappcon permisos de usuario todavía no puedo comunicarme con el USB.

Respuesta1

Todavía no es el "ajuste muggle" que realmente estoy buscando, pero al menos esto funciona:

Aparentemente hay dos directorios para udev (no tengo idea de por qué):

  • /etc/udev/rules.d
  • /lib/udev/rules.d

Había estado jugando con /libuno y no había llegado a ninguna parte. encontré el /etcindicadoaquí, y funciona:


PonerSUBSYSTEM=="usb", ATTRS{idVendor}=="VID", ATTRS{idProduct}=="PID", MODE="0666"

  • VIDes elID de proveedor asignado por USB-IFdel dispositivo en cuestión *

  • PIDes el ID de producto asignado por el proveedor del dispositivo en cuestión *

  • 0666da acceso universal de lectura/escritura a cualquier cosa que coincida con esta línea

    * $ lsusbpara ver todos los dispositivos USB conectados y sus ID.

En /etc/udev/rules.d/xx-my-rule.rules(puede necesitar permisos de root/sudo)

  • xxes cualquier número > 50 (el valor predeterminado es 50 y los números superiores tienen prioridad)
  • my-rulees como quieras llamarlo
  • debe terminar en.rules

Luego udevadm control --reload-rules(puede que también necesite permisos de root/sudo), y debería "simplemente funcionar" para ese par VID/PID específico.


Otra opción, para ajustar un poco más los permisos, es utilizar TAG+="uaccess"en lugar de MODE="0666". Esto limita el acceso al usuario (físico) actualmente conectado en lugar de a todos los usuarios. ¡Gracias @Lekensteyn!

Respuesta2

Para cualquiera que esté luchando con esto, necesitaba agregarGRUPO="plugdev"a mi regla udev en Ubuntu 18.04 para que funcione.

entonces para mi adaptador BTD-400 el archivo/etc/udev/rules.d/51-usb-device.ruleslee:

SUBSYSTEM=="usb", ATTRS{idVendor}=="0a5c", ATTRS{idProduct}=="21e8", GROUP="plugdev", TAG+="uaccess"

información relacionada