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 myapp
por 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 myapp
tener 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 usb
o libusb
al 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:
- No es el "ajuste muggle" que estaba buscando.
- 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
? - De todos modos, no parece hacer nada. Seguí esas instrucciones y reinicié, y
myapp
con 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 /lib
uno y no había llegado a ninguna parte. encontré el /etc
indicadoaquí, y funciona:
PonerSUBSYSTEM=="usb", ATTRS{idVendor}=="VID", ATTRS{idProduct}=="PID", MODE="0666"
VID
es elID de proveedor asignado por USB-IFdel dispositivo en cuestión *PID
es el ID de producto asignado por el proveedor del dispositivo en cuestión *0666
da acceso universal de lectura/escritura a cualquier cosa que coincida con esta línea*
$ lsusb
para ver todos los dispositivos USB conectados y sus ID.
En /etc/udev/rules.d/xx-my-rule.rules
(puede necesitar permisos de root/sudo)
xx
es cualquier número > 50 (el valor predeterminado es 50 y los números superiores tienen prioridad)my-rule
es 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"