Como faço para que o libusb funcione como não-root?

Como faço para que o libusb funcione como não-root?

Estou criando um dispositivo USB HID personalizado e um aplicativo de desktop para acompanhá-lo, usando HIDAPI no Lubuntu 16.04.3 LTS. Vamos ligar myapppor enquanto.

Aparentemente, se eu fizer isso $ ./myapp, libusb_open()falharei com LIBUSB_ERROR_ACCESS. (mostrado no meu depurador como -3; demorou um pouco para descobrir isso porque o enum não parece estar muito bem documentado)
Mas se eu fizer isso $ sudo ./myapp, ele terá sucesso.
Eu realmente não quero myappter permissões de root, então como posso falar com meu dispositivo USB sem elas?


Eu estava esperando por uma respostaaqui, mas parece ter sido abandonado exatamente neste ponto. Diz algo sobre permissões de usuário, mas não consigo encontrar isso em meu sistema. Achei que poderia encontrar um grupo chamado usbou libusbao qual pudesse me adicionar, mas não tive essa sorte.


Esta pergunta em um site SE diferentetem uma resposta que usa alguns arquivos de texto austeros para alterar as permissões globalmente (provavelmente uma má ideia) ou para um dispositivo específico, mas:

  1. Não é o "ajuste trouxa" que eu estava procurando.
  2. A maioria desses arquivos tem um aviso contra modificação direta porque são gerados automaticamente. Então, como posso ter certeza de que uma atualização aleatória de pacote não apagará minhas alterações e, portanto, quebrará myapp?
  3. Parece não fazer nada de qualquer maneira. Segui essas instruções e reiniciei, e myappcom permissões de usuário ainda não consigo falar com USB.

Responder1

Ainda não é o "ajuste do trouxa" que estou realmente procurando, mas pelo menos funciona:

Aparentemente, existem dois diretórios para o udev (não tenho ideia do porquê):

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

Eu estava mexendo com aquele /libe não chegando a lugar nenhum. Eu encontrei /etcaqueleaqui, e funciona:


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

  • VIDé oID do fornecedor atribuído por USB-IFdo dispositivo em questão *

  • PIDé o ID do produto atribuído pelo fornecedor do dispositivo em questão *

  • 0666dá acesso universal de leitura/gravação a tudo o que corresponde a esta linha

    * $ lsusbpara ver todos os dispositivos USB conectados e seus IDs.

In /etc/udev/rules.d/xx-my-rule.rules(pode precisar de permissões root/sudo)

  • xxé qualquer número > 50 (o padrão é 50 e números maiores têm prioridade)
  • my-ruleé como você quiser chamá-lo
  • deve terminar em.rules

Então udevadm control --reload-rules(também pode precisar de permissões root/sudo) e deve "simplesmente funcionar" para aquele par VID/PID específico.


Outra opção, para restringir um pouco mais as permissões, é usar TAG+="uaccess"no lugar de MODE="0666". Isso limita o acesso ao usuário atualmente conectado (físico) em vez de a todos os usuários. Obrigado @Lekensteyn!

Responder2

Para qualquer outra pessoa que esteja lutando com isso - eu precisava adicionarGRUPO="plugdev"à minha regra udev no Ubuntu 18.04 para que funcione.

então, para meu adaptador BTD-400, o arquivo/etc/udev/rules.d/51-usb-device.ruleslê:

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

informação relacionada