Я создаю пользовательское USB-устройство HID и приложение для настольных компьютеров, чтобы использовать его, используя HIDAPI на Lubuntu 16.04.3 LTS. Мы будем называть это myapp на данный момент.
По-видимому, если я выполняю $ ./myapp, libusb_open() терпит неудачу с LIBUSB_ERROR_ACCESS. (показанный в моем отладчике как -3, потребовалось некоторое время, чтобы понять это, потому что перечисление, похоже, не очень хорошо документировано). Но если я $ sudo ./myapp, он преуспеет. Я действительно не хочу, чтобы myapp имел права root, поэтому как я могу разговаривать с моим USB-устройством без них?
Я надеялся на ответ здесь, но это кажется, был брошен именно в этот момент. В нем говорится о полномочиях пользователей, но я не могу найти их в своей системе. Я думал, что могу найти группу под названием usb или libusb, к которой я мог бы добавить себя, но такой удачи не было.
здесь ответ, который использует некоторые строгие текстовые файлы для изменения разрешений либо глобально (возможно, плохая идея), либо для определенного устройства, но:
Это не «трюк маггла», который я искал. Большинство из этих файлов имеют предупреждение против изменения напрямую, поскольку они автоматически генерируются. Итак, как я могу быть уверен, что случайное обновление пакета не уничтожит мои изменения и, таким образом, сломает myapp? В любом случае, он ничего не делает. Я выполнил эти инструкции и перезагрузился, а myapp с правами пользователя по-прежнему не может разговаривать с USB.Это все еще не «трюк маггла», который я действительно ищу, но по крайней мере это работает:
По-видимому, есть два каталога для udev (я не знаю, почему):
/etc/udev/rules.d /lib/udev/rules.dЯ возился с /lib и ничего не получал. Я нашел здесь /etc, и он работает:
Положите SUBSYSTEM=="usb", ATTRS{idVendor}=="VID", ATTRS{idProduct}=="PID", MODE="0666"
/etc/udev/rules.d PID - Идентификатор продукта, присвоенный поставщиком соответствующего устройства * /lib/udev/rules.dВ /etc/udev/rules.d/xx-my-rule.rules (могут потребоваться права root / sudo)
PID - это идентификатор продукта, назначенный поставщиком соответствующего устройства * my-rule - это то, что вы хотите назвать, должно заканчиваться на .rulesЗатем udevadm control --reload-rules (также могут потребоваться права root / sudo), и он должен «просто работать» для этой конкретной пары VID / PID.
Еще один вариант - немного ограничить права доступа более того, использовать TAG+="uaccess" вместо MODE="0666". Это ограничивает доступ к текущему (физическому) пользователю, а не ко всем пользователям. Спасибо @Lekensteyn!
Это все еще не «трюк маггла», который я действительно ищу, но по крайней мере это работает:
По-видимому, есть два каталога для udev (я не знаю, почему):
/etc/udev/rules.d /lib/udev/rules.dЯ возился с /lib и ничего не получал. Я нашел здесь /etc, и он работает:
Положите SUBSYSTEM=="usb", ATTRS{idVendor}=="VID", ATTRS{idProduct}=="PID", MODE="0666"
/etc/udev/rules.d PID - Идентификатор продукта, присвоенный поставщиком соответствующего устройства * /lib/udev/rules.dВ /etc/udev/rules.d/xx-my-rule.rules (могут потребоваться права root / sudo)
PID - это идентификатор продукта, назначенный поставщиком соответствующего устройства * my-rule - это то, что вы хотите назвать, должно заканчиваться на .rulesЗатем udevadm control --reload-rules (также могут потребоваться права root / sudo), и он должен «просто работать» для этой конкретной пары VID / PID.
Еще один вариант - немного ограничить права доступа более того, использовать TAG+="uaccess" вместо MODE="0666". Это ограничивает доступ к текущему (физическому) пользователю, а не ко всем пользователям. Спасибо @Lekensteyn!