Как заставить 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, к которой я мог бы добавить себя, но такой удачи не было.

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

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

1
задан 26 November 2017 в 04:31

2 ответа

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

По-видимому, есть два каталога для 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!

1
ответ дан 18 July 2018 в 02:55

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

По-видимому, есть два каталога для 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!

1
ответ дан 24 July 2018 в 17:41

Другие вопросы по тегам:

Похожие вопросы: