web-dev-qa-db-fra.com

Comment autoriser l'accès logiciel à n'importe quel périphérique USB?

J'ai un programme basé sur libusb qui ne peut pas ouvrir de périphériques USB sur un Ubuntu fraîchement installé car il manque d'autorisations.

Cette solution fonctionnera probablement pour moi, mais cela nécessite de spécifier manuellement chaque périphérique - et j'en ai plusieurs. J'ai donc essayé ceci (dans un fichier /etc/udev/rules.d/41-cvs-permissions.rules):

SUBSYSTEM=="usb", MODE:="0666"

J'ai omis VID et PID, en espérant que la règle sera simplement appliquée à TOUS les appareils. Cela a certainement un effet, mais l'effet est plutôt étrange: au lieu de détecter 5 périphériques qu'il ne peut pas ouvrir, libusb n'en détecte que 2 maintenant - les deux sont des contrôleurs hôtes USB, pas des périphériques réels.

Comment réaliser ce que je veux?

3
Violet Giraffe

La façon dont je traite les périphériques USB consiste à donner à tous les groupes un accès spécifique.

En tant que root:

echo 'SUBSYSTEM=="usb", MODE="0660", GROUP="plugdev"' > /etc/udev/rules.d/00-usb-permissions.rules
udevadm control --reload-rules

Cela permet essentiellement d’accorder aux membres du groupe plugdev un accès en lecture et en écriture pour tout périphérique USB.

1
Justin Buser

Je conviens que faire correspondre les règles à l'aide de VID/PID n'est pas une solution définitive. Mais vous pouvez utiliser plusieurs appareils dans la même règle sans cibler aveuglément tous les périphériques USB comme vous l’avez fait. Exemple d'utilisation de DRIVER nom (usb-storage, usbhid, ..) ou KERNEL nom (tty*, sd*, ..), même avec un minimum regex (sd[a-z][0-9]*, usb*).

Vous devriez rechercher des similitudes dans leurs attributs.

  1. Enlevez tous ces appareils
  2. Enregistrer la liste actuelle des périphériques dans /dev

    ls /dev > /tmp/dev_list0.txt
    
  3. Branchez l'un des périphériques cibles

  4. Enregistrer la liste des périphériques dans un autre fichier

    ls /dev > /tmp/dev_list.txt
    
  5. Comparer les fichiers, > périphérique ajouté, < périphérique supprimé

    $ colordiff /tmp/dev_list0.txt /tmp/dev_list.txt
    85a86,87
    > sdc
    > serial
    89a92,93
    > sg4
    > sg5
    93a98
    > sr1
    194a200,201
    > ttyUSB0
    > ttyUSB1
    

    Ceci est un modem 3G.

  6. Vérifiez l'attribut pour toutes les interfaces dont vous avez besoin, par exemple:

    udevadm info --attribute-walk --name=/dev/ttyUSB0
    

Faites la même chose pour tous les appareils que vous voulez. Si vous ne savez pas comment, téléchargez leur sortie udevadm info --attribute-walk --name=... et associez-la à votre question.

Notez que tous les périphériques USB ne créent pas de nœud dans /dev. Certains que vous avez recherchés dans l'arborescence SYSFS /sys. Puis vérifiez leurs attributs en utilisant --path

udevadm info --attribute-walk --path=...

En procédant de la même manière que ci-dessus, vous pouvez vérifier les nœuds de périphérique créés en surveillant les événements udev:

udevadm monitor
1
user.dz