Ermöglichen Sie Nicht-Root-Benutzern das Lesen / Schreiben / Entwickeln von Dateien

8

In meinem /devOrdner möchte ich, dass die folgenden Dateien vom Benutzer lesbar und beschreibbar sind:

/dev/ttyUSB0
/dev/gpib0

Wie mache ich das ohne zu benutzen chgrp? Ich kann bearbeiten /etc/udev/rules.d, kenne aber die Syntax nicht.

Kit
quelle
1
Warum möchten Sie diesen Lese- / Schreibberechtigungen erteilen?
slm
Ich verwende diesen PC als Controller für verschiedene Test- und Instrumentierungsgeräte (Oszilloskope, Leistungsmesser usw.). Alle Lese- / Schreibvorgänge werden von Python-Skripten und -Bibliotheken ausgeführt. Der Benutzer selbst kann kein Lesen / Schreiben auf niedriger Ebene durchführen. Nehmen wir an, dass das System unendlich sicher ist. Ich möchte es meinen Laborkollegen bequem machen, Skripte für die Instrumente zu schreiben.
Kit
3
Warum nicht stattdessen einfach den Kollegen sudo Zugang gewähren?
slm

Antworten:

11

Wie udev-Regeln aufgebaut sind

Für Geräte, die in das Subsystem tty fallen, können Sie ihre Gruppe wie folgt festlegen:

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

Beachten Sie, dass es sich wie bei der allgemeinen Programmierung ==um einen Test auf Gleichheit handelt, während =es sich um eine Zuweisung handelt. Die obige Anweisung bedeutet also "wenn SUBSYSTEM=="tty"dann zuweisen" GROUP="dialout". Eine Anweisung kann mehrere Tests, die zusammen erstellt werden, und mehrere Zuweisungen enthalten.

Wenn Sie die Lese- / Schreib- / Ausführungsberechtigungen ändern möchten, weisen Sie MODE anstelle von GROUP zu, wobei MODE der üblichen Unix-Oktalschreibweise folgt, z. B. MODE="0660"dem Eigentümer und der Gruppe Lese- / Schreibberechtigungen erteilt. man udevhat alle Details.

Viele Beispiele für solche Regeln finden Sie in /lib/udev/rules.d/91-permissions.rules

So fügen Sie Ihrem System eine udev-Regel hinzu

Sobald Sie sich für eine Regel entschieden haben, können Sie diese einfach hinzufügen. Wechseln Sie auf einem von Debian abgeleiteten System in das Verzeichnis /etc/udev/rules.dund erstellen Sie eine Datei. Dateien werden in Sortierreihenfolge ausgeführt. Versuchen Sie also einen Namen wie, damit Ihre Regeldatei die zuletzt gelesene Datei ist und frühere überschreibt 99-instruments.rules. Fügen Sie dann Ihre Regeln in diese Datei ein, eine pro Zeile. (Bei Bedarf können Zeilen erweitert werden, indem wie in der Shell ein Backslash am Ende der Zeile eingefügt wird.)

Wenn Sie also Gruppen und Berechtigungen auf tty-Geräten ändern möchten, kann Ihre Datei /etc/udev/rules.d/99-instruments.rulesaus einer einzelnen Zeile bestehen:

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

So stellen Sie sicher, dass Ihre neue Datei selbst über die üblichen Berechtigungen verfügt:

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

Nachdem Sie Ihre Datei erstellt haben, kann udevd sie automatisch lesen. Wenn nicht, können Sie das erneute Lesen der Dateien erzwingen mit:

udevadm control --reload-rules

Weitere Informationen zur Klassifizierung von Geräten durch udev

Wenn Sie genauer steuern möchten, welche Geräte auf welche Regeln reagieren, können Sie mehr darüber erfahren, wie udev Ihre Geräte sieht, indem Sie / sys / lesen. Im Moment habe ich keinen Zugriff auf einen Computer mit einem ttyUSB oder einem HPIB. Lassen Sie uns also ein Beispiel für die Festplatte sda ​​machen. Lauf:

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

Dies gibt viele Informationen, die wie folgt aussehen:

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

Diese Zeilen haben alle die Form, die als ifKlauseln in Regeln verwendet werden kann. Um beispielsweise den Besitz aller Blockgeräte zu ändern, die als nicht entfernbar markiert sind, verwenden wir die folgende Regel:

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

Mit Informationen von udevadmkann man Regeln entwickeln, die speziell auf die interessierenden Geräte abzielen.

John1024
quelle
Das erste Beispiel sollte ein Komma haben, kein Punkt vor MODE =
Jim Hunziker
1
@ JimHunziker Danke dafür. Der Tippfehler ist jetzt korrigiert.
John1024
4

Ich denke, ich würde vorschlagen, die Regel etwas restriktiver zu gestalten als die von John. Erstellen Sie beispielsweise eine Datei wie /etc/udev/rules.d/99-tty-dialout.rules:

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

Sie können udevadmdamit Geräte SUBSYSTEM==und KERNEL==Werte ermitteln. Zum Beispiel:

$ 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
quelle