Erlaubt dem Benutzer, den Pfad zum angegebenen Verzeichnis zu durchlaufen

Erlaubt dem Benutzer, den Pfad zum angegebenen Verzeichnis zu durchlaufen

Angenommen, ich möchte einem Benutzer colleagueLesezugriff auf ein Verzeichnis gewähren /rather/long/path/to/the/directory, aber nicht unbedingt auf die übergeordneten Verzeichnisse.

Wie beispielsweise erklärtHierUndDort, ich muss zuerst sicherstellen, dass colleagueder Pfad durchlaufen werden kann. Mit setfacl:

setfacl -m u:colleague:x /rather
setfacl -m u:colleague:x /rather/long
setfacl -m u:colleague:x /rather/long/path
setfacl -m u:colleague:x /rather/long/path/to
setfacl -m u:colleague:x /rather/long/path/to/the
setfacl -m u:colleague:xr /rather/long/path/to/the/directory

Dies ist bei einem tief verschachtelten Pfad recht mühsam. Gibt es eine elegantere Möglichkeit, dies zu tun?

PS Um es ein bisschen schwieriger zu machen: Als normaler Benutzer habe ich möglicherweise nicht das Recht, die Berechtigungen für das oberste Verzeichnis im Pfad zu ändern (z. B. /home). Wenn möglich, sollte die Lösung diese Verzeichnisse entweder ignorieren (vorausgesetzt, sie colleaguekönnen durchlaufen werden) oder, noch besser, prüfen, ob colleaguesie durchlaufen werden dürfen, und eine Fehlermeldung ausgeben, wenn dies nicht der Fall ist.

Antwort1

Die einfache, dumme Antwort:

Du kannstverkürzenIhre Befehlsfolge ein wenig, indem Sie die erstenN–1 davon:

setfacl -mu:Kollege:x /eher /eher/lang /eher/langer/Pfad /eher/langer/Pfad/zu /eher/langer/Pfad/zu/dem
setfacl -mu:Kollege:xr /ziemlich/langer/Pfad/zum/Verzeichnis

Eine „offensichtliche“ Warnung:

Selbst wenn Sie Eigentümer des Zielverzeichnisses (Blattverzeichnisses) sind, müssen Sie Ausführungszugriff (Durchlaufzugriff) auf jedes Verzeichnis im Pfad haben. Wenn es ein Verzeichnis gibt, auf das Sie keinen Zugriff haben und das Ihnen nicht gehört, haben Sie Pech gehabt. (Sie müssen eine Identität annehmen (d. h. rootoder der Eigentümer des Verzeichnisses), die Ihnen den Zugriff ermöglicht, oder jemanden überzeugen, der die Befugnis dazu hat. Das liegt außerhalb des Rahmens dieser Frage.)

Wenn es jedoch Zwischenverzeichnisse gibt, die Ihnen gehören, auf die Sie aber keinen Zugriff haben (z. B. jemand anderes hat dies getan chmod 0), müssen Sie sich selbst Zugriff gewähren.von oben nach unten.

Die Antwort: (TL;DR)

Ich habe diesen Punkt oben angesprochen, weil dies von unten nach oben funktioniert:

leaf="/ziemlich/langer/Pfad/zum/Verzeichnis"
Zweig="$Blatt"
während branch="$(dirname "$branch")"
Tun
     setfacl -mu:Kollege:x "$branch" || Unterbrechung
     wenn [ "$branch" = / ]
     Dann
         brechen
     fi
Erledigt
setfacl -mu:Kollege:xr "$Blatt"

Optional können Sie alle Fehlermeldungen von verbergen, setfaclindem Sie hinzufügen 2> /dev/null. Wenn Sie eine pathologische Situation haben, in der Sie /rather/long und besitzen /rather/long/path/to, aber nicht /rather/long/path(aber dessen Berechtigungen offen sind), entfernen Sie das || breaknach dem setfacl, da Sie weiter den Baum hinaufklettern müssen, nachdem der Fehler bei aufgetreten ist setfacl … /rather/long/path. Andernfalls, wenn Sie nicht sind root, müssen SiekönnteEntfernen Sie den if [ "$branch" = / ]Test, da die Schleife beendet wird, wenn Sie eine Verzeichnisebene erreichen, auf der Sie nicht ausführen können setfacl. (Aber das ist keine gute Idee; wenn Sie dies als Skript speichern, werden Sie es eines Tages als ausführen rootund dann haben Sie eine Endlosschleife.)

Es versteht sich von selbst, dass, wenn Sie daraus ein Skript machen, der Verzeichnispfad und der Name des Kollegen Parameter sein sollten.

verwandte Informationen