Autoriser les utilisateurs non root à lire / écrire / fichiers de développement

8

Dans mon /devdossier, j'aimerais que les fichiers suivants soient lisibles et inscriptibles par l'utilisateur:

/dev/ttyUSB0
/dev/gpib0

Comment faire sans utiliser chgrp? Je peux éditer /etc/udev/rules.dmais je ne connais pas la syntaxe.

Trousse
la source
1
Pourquoi voulez-vous leur donner des autorisations de lecture / écriture?
slm
J'utilise ce PC comme contrôleur pour plusieurs appareils de test et d'instrumentation (oscilloscopes, wattmètres, etc.) Toutes les lectures / écritures seront effectuées par des scripts et des bibliothèques Python. Aucune lecture / écriture de bas niveau ne sera effectuée par l'utilisateur lui-même. Supposons que le système soit infiniment sécurisé. J'aimerais que mes collègues de laboratoire écrivent des scripts pour les instruments.
Kit
3
Pourquoi ne pas simplement donner accès aux collègues sudo à la place?
slm

Réponses:

11

Structure des règles udev

Pour les périphériques entrant dans le sous-système tty, vous pouvez définir leur groupe comme suit:

SUBSYSTEM=="tty", GROUP="dialout"

Notez que, tout comme dans la programmation courante, ==est un test d'égalité tandis =qu'une assignation. Ainsi, l'instruction ci-dessus se traduit par "si SUBSYSTEM=="tty"alors affectez GROUP="dialout". Une instruction peut avoir plusieurs tests, qui sont édités ensemble et plusieurs affectations.

Si vous souhaitez modifier les autorisations de lecture-écriture-exécution, affectez alors MODE au lieu de GROUP où MODE suit la notation octale Unix habituelle, par exemple MODE="0660"donne au propriétaire et au groupe les autorisations de lecture-écriture. man udeva tous les détails.

Vous pouvez trouver de nombreux exemples de telles règles dans /lib/udev/rules.d/91-permissions.rules

Comment ajouter une règle udev à votre système

Une fois que vous avez déterminé ce que vous voulez que votre règle soit, il est assez simple de l'ajouter. Sur un système dérivé de Debian, accédez au répertoire /etc/udev/rules.det créez un fichier. Les fichiers sont exécutés dans l'ordre de tri. Donc, pour que votre fichier de règles soit le dernier à être lu, en remplaçant les précédents, essayez un nom comme 99-instruments.rules. Mettez ensuite vos règles dans ce fichier, une par ligne. (Si nécessaire, les lignes peuvent être étendues en mettant une barre oblique inversée à la fin de la ligne, tout comme dans le shell.)

Donc, si vous souhaitez modifier le groupe et les autorisations sur les périphériques tty, votre fichier /etc/udev/rules.d/99-instruments.rulespeut être composé d'une seule ligne:

SUBSYSTEM=="tty", GROUP="dialout", MODE="0660"

Pour vous assurer que votre nouveau fichier lui-même dispose des autorisations habituelles:

sudo chown root:root /etc/udev/rules.d/99-instruments.rules
sudo chmod 0644 /etc/udev/rules.d/99-instruments.rules

Après avoir créé votre fichier, udevd peut le lire automatiquement. Sinon, vous pouvez le forcer à relire ses fichiers avec:

udevadm control --reload-rules

En savoir plus sur la façon dont udev classe les appareils

Si vous souhaitez obtenir un contrôle plus fin sur les appareils qui répondent à quelles règles, vous pouvez en savoir plus sur la façon dont udev voit vos appareils en lisant / sys /. Pour le moment, je n'ai pas accès à une machine avec un ttyUSB ou un HPIB, alors faisons un exemple de disque sda. Courir:

udevadm info --attribute-walk --path=/sys/block/sda

Cela donne beaucoup d'informations qui ressemblent à:

. . . .
KERNEL=="sda"
SUBSYSTEM=="block"
DRIVER==""
ATTR{range}=="16"
ATTR{ext_range}=="256"
ATTR{removable}=="0"
. . . .

Ces lignes sont toutes sous la forme appropriée pour être utilisées comme ifclauses dans les règles. Ainsi, par exemple, pour modifier la propriété de tous les périphériques de bloc marqués comme non amovibles, nous utiliserions la règle:

SUBSYSTEM=="block", ATTR{removable}=="0", OWNER=john1024

Avec des informations provenant de udevadm, on peut développer des règles qui peuvent cibler spécifiquement les appareils d'intérêt.

John1024
la source
Le premier exemple devrait avoir une virgule, pas un point, avant MODE =
Jim Hunziker
1
@JimHunziker Merci pour cela. La faute de frappe est maintenant corrigée.
John1024
4

Je pense que je suggérerais de rendre la règle un peu plus restrictive que celle de John. Par exemple, créez un fichier tel que /etc/udev/rules.d/99-tty-dialout.rules:

SUBSYSTEM=="tty", KERNEL=="ttyUSB0", GROUP="dialout", MODE="0660"

Vous pouvez utiliser udevadmpour déterminer un périphérique SUBSYSTEM==et des KERNEL==valeurs. Par exemple:

$ udevadm info -a -n /dev/tty0

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/virtual/tty/tty0':
    KERNEL=="tty0"
    SUBSYSTEM=="tty"
    DRIVER==""
    ATTR{active}=="tty1"
slm
la source