web-dev-qa-db-fra.com

Comment faire que libusb fonctionne en tant que non-root?

Je crée un périphérique USB HID personnalisé et une application de bureau qui l'accompagne, en utilisant HIDAPI sur Lubuntu 16.04.3 LTS. Nous l'appellerons myapp pour l'instant.

Apparemment, si je fais $ ./myapp, libusb_open() échoue avec LIBUSB_ERROR_ACCESS(affiché dans mon débogueur sous la forme -3; il a fallu un certain temps pour le comprendre car l'enum ne semble pas très bien documenté)
Mais si je fais $ Sudo ./myapp, ça réussit.
Je ne veux vraiment pas que myapp ait les droits root, alors comment puis-je parler à mon périphérique USB sans eux?


J'espérais une réponse ici , mais il semble avoir été abandonné à ce moment précis. Cela en dit long sur les autorisations des utilisateurs, mais je n'arrive pas à le trouver sur mon système. J'ai pensé que je pourrais trouver un groupe appelé usb ou libusb auquel je pourrais ajouter moi-même, mais aucune chance de ce type.


Cette question sur un site SE différent a une réponse qui utilise des fichiers texte austères pour modifier les autorisations soit globalement (probablement une mauvaise idée), soit pour un périphérique spécifique, mais:

  1. Ce n'était pas le "Tweak des Moldus" que je cherchais.
  2. La plupart de ces fichiers ont un avertissement contre la modification directe car ils sont générés automatiquement. Alors, comment puis-je être sûr qu'une mise à jour aléatoire du paquet ne va pas effacer mes modifications et donc casser myapp?
  3. Cela ne semble rien faire de toute façon. J'ai suivi ces instructions et redémarré. myapp avec des autorisations utilisateur ne peut toujours pas parler à USB.
3
AaronD

Ce n'est toujours pas le "Tweak des Moldus" que je recherche vraiment, mais au moins, cela fonctionne:

Apparemment, il y a deux répertoires pour udev (je ne sais pas pourquoi):

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

Je m'étais amusé avec le /lib et n'avais abouti à rien. J'ai trouvé le /etc one here , et ça marche:


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

  • VID est le ID de fournisseur attribué par l'USB-IF du périphérique en question *
  • PID est l'ID de produit attribué par le fournisseur du périphérique en question *
  • 0666 donne un accès universel en lecture/écriture à tout ce qui correspond à cette ligne

    $ lsusb pour voir tous les périphériques USB connectés et leurs identifiants.

Dans /etc/udev/rules.d/xx-my-rule.rules (peut avoir besoin d'autorisations root/Sudo)

  • xx est un nombre quelconque> 50 (les valeurs par défaut sont 50 et les nombres les plus élevés sont prioritaires)
  • my-rule est ce que vous voulez appeler
  • doit se terminer par .rules

Ensuite, udevadm control --reload-rules (peut également avoir besoin d'autorisations root/Sudo), et cela devrait "fonctionner" pour cette paire spécifique VID/PID.


Une autre option, pour resserrer un peu plus les autorisations, consiste à utiliser TAG+="uaccess" à la place de MODE="0666". Cela limite l'accès à l'utilisateur (physique) actuellement connecté au lieu de tous les utilisateurs. Merci @Lekensteyn!

4
AaronD

Pour tous ceux qui ont des problèmes avec cela - je devais ajouter GROUP = "plugdev" à ma règle udev sous Ubuntu 18.04 pour que cela fonctionne.

donc pour mon adaptateur BTD-400 le fichier / etc/udev/rules.d/51-usb-device.rules se lit comme suit:

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