
Angenommen, ich möchte einem Benutzer colleague
Lesezugriff 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 colleague
der 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 colleague
können durchlaufen werden) oder, noch besser, prüfen, ob colleague
sie 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. root
oder 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, setfacl
indem 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 || break
nach 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 root
und 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.