Wie kann ich Libusb als Nicht-Root-Benutzer zum Laufen bringen?

Wie kann ich Libusb als Nicht-Root-Benutzer zum Laufen bringen?

Ich erstelle ein benutzerdefiniertes USB-HID-Gerät und eine dazugehörige Desktop-App mit HIDAPI auf Lubuntu 16.04.3 LTS. Wir nennen es myappvorerst.

Wenn ich dies tue $ ./myapp, schlägt dies anscheinend libusb_open()mit fehl LIBUSB_ERROR_ACCESS. (wird in meinem Debugger als angezeigt -3; es hat eine Weile gedauert, das herauszufinden, da die Aufzählung nicht sehr gut dokumentiert zu sein scheint.)
Aber wenn ich dies tue $ sudo ./myapp, funktioniert es.
Ich möchte wirklich keine myappRoot-Berechtigungen haben, also wie kann ich ohne sie mit meinem USB-Gerät kommunizieren?


Ich hatte auf eine Antwort gehofftHier, aber es scheint genau an dieser Stelle aufgegeben worden zu sein. Es steht etwas über Benutzerberechtigungen, aber ich kann das auf meinem System nicht finden. Ich dachte, ich könnte eine Gruppe namens usboder finden libusb, der ich mich hinzufügen könnte, aber ich hatte kein Glück.


Diese Frage auf einer anderen SE-Sitehat eine Antwort, die einige nüchterne Textdateien verwendet, um die Berechtigungen entweder global (wahrscheinlich eine schlechte Idee) oder für ein bestimmtes Gerät zu ändern, aber:

  1. Es ist nicht der „Muggel-Tweak“, nach dem ich gesucht habe.
  2. Die meisten dieser Dateien sind mit einer Warnung versehen, dass sie nicht direkt geändert werden dürfen, da sie automatisch generiert werden. Wie kann ich also sicher sein, dass ein zufälliges Paketupdate meine Änderungen nicht löscht und somit nicht mehr funktioniert myapp?
  3. Es scheint trotzdem nichts zu bewirken. Ich habe diese Anweisungen befolgt und neu gestartet, myappkann aber mit Benutzerberechtigungen immer noch nicht mit USB kommunizieren.

Antwort1

Es ist zwar immer noch nicht der „Muggel-Tweak“, den ich wirklich suche, aber zumindest das hier funktioniert:

Anscheinend gibt es zwei Verzeichnisse für udev (ich habe keine Ahnung, warum):

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

Ich habe mit dem einen herumgespielt /libund bin nicht weitergekommen. Ich habe den /etceinen gefundenHier, und es funktioniert:


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

  • VIDist derVon USB-IF zugewiesene Vendor-IDdes betreffenden Gerätes *

  • PIDist die vom Hersteller zugewiesene Produkt-ID des betreffenden Geräts *

  • 0666gibt universellen Lese-/Schreibzugriff auf alles, was dieser Zeile entspricht

    * $ lsusbum alle angeschlossenen USB-Geräte und ihre IDs anzuzeigen.

In /etc/udev/rules.d/xx-my-rule.rules(möglicherweise sind Root-/Sudo-Berechtigungen erforderlich)

  • xxist eine beliebige Zahl > 50 (die Standardwerte liegen im Bereich von 50, höhere Zahlen haben Vorrang)
  • my-ruleist, wie immer Sie es nennen wollen
  • muss enden in.rules

Dann udevadm control --reload-rules(möglicherweise sind auch Root-/Sudo-Berechtigungen erforderlich) sollte es für dieses bestimmte VID/PID-Paar „einfach funktionieren“.


Eine weitere Möglichkeit, die Berechtigungen etwas weiter einzuschränken, ist die Verwendung TAG+="uaccess"von anstelle von MODE="0666". Dadurch wird der Zugriff auf den aktuell angemeldeten (physischen) Benutzer anstatt auf alle Benutzer beschränkt. Danke, @Lekensteyn!

Antwort2

Für alle anderen, die damit zu kämpfen haben - ich musste hinzufügenGRUPPE="plugdev"zu meiner Udev-Regel unter Ubuntu 18.04, damit es funktioniert.

also für meinen BTD-400 Adapter die Datei/etc/udev/rules.d/51-usb-device.ruleslautet:

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

verwandte Informationen