Como fazer o libusb funcionar como não-raiz?

1

Estou criando um dispositivo USB HID personalizado e um aplicativo de desktop para usá-lo, usando o HIDAPI no Lubuntu 16.04.3 LTS. Vamos chamá-lo myapp por enquanto.

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

Eu estava esperando por uma resposta aqui , mas parece ter sido abandonada exatamente neste ponto. Ele diz algo sobre as permissões do usuário, mas não consigo encontrar isso no meu sistema. Eu pensei que poderia encontrar um grupo chamado usb ou libusb que eu poderia adicionar, mas não tive essa sorte.

Esta pergunta em um site SE diferente tem um 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 "tweak trouxa" que eu estava procurando.
  2. A maioria desses arquivos tem um aviso contra a modificação direta porque eles são gerados automaticamente. Então, como posso ter certeza de que uma atualização de pacote aleatório não vai acabar com minhas alterações e, assim, quebrar myapp ?
  3. Não parece fazer nada de qualquer maneira. Eu segui essas instruções e reiniciei, e myapp com permissões de usuário ainda não pode falar com USB.
por AaronD 20.11.2017 / 22:29

1 resposta

1

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

Aparentemente, existem dois diretórios para o udev (não sei por que):

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

Eu estava mexendo com o /lib e não chegando a lugar nenhum. Eu encontrei o /etc one aqui , e ele funciona:

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

  • VID é o ID do fornecedor atribuído por USB-IF do dispositivo em questão *
  • PID é o ID do produto atribuído pelo fornecedor do dispositivo em questão *
  • 0666 fornece acesso universal de leitura / gravação para o que corresponder a essa linha

    * $ lsusb para ver todos os dispositivos USB conectados e suas IDs.

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

  • xx é qualquer número > 50 (os padrões estão em 50 e os números mais altos têm prioridade)
  • my-rule é o que você quiser chamá-lo
  • deve terminar em .rules

Em seguida, udevadm control --reload-rules (também pode precisar de permissões root / sudo) e deve "apenas funcionar" para esse par específico de VID / PID.

Outra opção, para apertar 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 todos os usuários. Obrigado @Lekensteyn!

    
por AaronD 28.11.2017 / 00:35