Я создаю нестандартное USB-устройство HID и настольное приложение для него, используя HIDAPI на Lubuntu 16.04.3 LTS. Сейчас мы назовем это myapp
.
Очевидно, если я сделаю $ ./myapp
, libusb_open()
потерпит неудачу с LIBUSB_ERROR_ACCESS
. (показано в моем отладчике как -3
; потребовалось некоторое время, чтобы выяснить это, потому что перечисление не очень хорошо задокументировано)
Но если я это сделаю $ sudo ./myapp
, это успешно.
Я действительно не хочу, чтобы у myapp
были права доступа root, так как я могу общаться с моим USB-устройством без них?
Я надеялся получить ответ здесь , но похоже, именно от этого и отказались. Это говорит о правах пользователя, но я не могу найти это в моей системе. Я думал, что мог бы найти группу под названием usb
или libusb
, к которой я мог бы добавить себя, но не такая удача.
На этот вопрос на другом сайте SE есть ответ, в котором используются некоторые строгие текстовые файлы для изменения разрешений либо глобально (вероятно, плохая идея), либо для конкретного устройства, но:
myapp
? myapp
с разрешениями пользователей все еще не может общаться с USB. Я все еще не ищу "настройки магла", но, по крайней мере, это работает:
Очевидно, есть две директории для 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!
Для всех, кто боролся с этим - мне нужно было добавить GROUP = "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"