Как заставить libusb работать без прав root?

Как заставить libusb работать без прав root?

Я создаю пользовательское USB HID устройство и настольное приложение для него, используя HIDAPI на Lubuntu 16.04.3 LTS. Назовем его myappпока.

Видимо, если я делаю $ ./myapp, libusb_open()происходит сбой с LIBUSB_ERROR_ACCESS. (в моем отладчике это отображается как -3; потребовалось некоторое время, чтобы это выяснить, поскольку перечисление, похоже, не очень хорошо документировано)
Но если я делаю $ sudo ./myapp, это происходит успешно.
Я действительно не хочу myappиметь права root, так как я могу общаться с моим USB-устройством без них?


Я надеялся на ответ.здесь, но, похоже, именно в этот момент его и забросили. Там что-то написано о разрешениях пользователей, но я не могу найти это в своей системе. Я думал, что найду группу под названием usbили libusb, в которую я мог бы себя добавить, но не тут-то было.


Этот вопрос на другом сайте SEесть ответ, который использует некоторые строгие текстовые файлы для изменения разрешений либо глобально (вероятно, плохая идея), либо для конкретного устройства, но:

  1. Это не «магловская хитрость», которую я искал.
  2. Большинство этих файлов имеют предупреждение против прямого изменения, поскольку они генерируются автоматически. Так как я могу быть уверен, что случайное обновление пакета не сотрет мои изменения и, таким образом, не сломает myapp?
  3. Кажется, это ничего не делает. Я следовал этим инструкциям и перезагрузился, но myappс правами пользователя все еще не могу общаться с USB.

решение1

Это все еще не та «магловская хитрость», которую я действительно ищу, но, по крайней мере, это работает:

Судя по всему, для udev существует два каталога (понятия не имею, почему):

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

Я возился с /libодним и ничего не вышло. Я нашел /etcодинздесь, и это работает:


ПомещатьSUBSYSTEM=="usb", ATTRS{idVendor}=="VID", ATTRS{idProduct}=="PID", MODE="0666"

  • VIDэтоИдентификатор поставщика, назначенный USB-IFрассматриваемого устройства *

  • PIDэто присвоенный поставщиком идентификатор продукта рассматриваемого устройства *

  • 0666предоставляет универсальный доступ на чтение/запись для всего, что соответствует этой строке

    * $ lsusbчтобы увидеть все подключенные USB-устройства и их идентификаторы.

В /etc/udev/rules.d/xx-my-rule.rules(могут потребоваться права root/sudo)

  • xxлюбое число > 50 (значение по умолчанию — 50, более высокие числа имеют приоритет)
  • my-ruleкак хотите это называйте
  • должен заканчиваться на.rules

Затем udevadm control --reload-rules(также могут потребоваться права root/sudo), и это должно «просто работать» для этой конкретной пары VID/PID.


Другой вариант, чтобы немного ужесточить разрешения, — использовать TAG+="uaccess"вместо MODE="0666". Это ограничивает доступ для текущего вошедшего в систему (физического) пользователя, а не для всех пользователей. Спасибо @Lekensteyn!

решение2

Для тех, кто еще с этим борется - мне нужно было добавитьГРУППА="plugdev"в правило udev в Ubuntu 18.04, чтобы это заработало.

поэтому для моего адаптера BTD-400 файл/etc/udev/rules.d/51-usb-device.rulesчитает:

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

Связанный контент