Legen Sie Lese- und Schreibberechtigungen für Ordner und alle übergeordneten Verzeichnisse fest

17

Ich muss Lese- und Schreibberechtigungen für rootBenutzer zum Verzeichnis subfolderNund zu allen seinen übergeordneten Ordnern bis einstellen root.

Ich kann es mit den Händen machen:

$ sudo chmod +rx /root/subfolder1/subfolder2/subfolderN
$ sudo chmod +rx /root/subfolder1/subfolder2
$ sudo chmod +rx /root/subfolder1
$ sudo chmod +rx /root

Aber wenn Nes groß ist, bin ich müde. Wie mache ich das automatisch mit einem Befehl?

Maxim Yefremov
quelle
Du solltest die Welt wirklich nicht/root lesbar machen.
Stéphane Chazelas

Antworten:

22

Dies kann einfach in der Shell durchgeführt werden, beginnend im Unterverzeichnis und aufwärts bewegend:

f=/root/subfolder1/subfolder2/subfolderN
while [[ $f != / ]]; do chmod +rx "$f"; f=$(dirname "$f"); done;

Dies beginnt mit der Datei / dem Verzeichnis, das Sie auch für f festgelegt haben, und funktioniert in jedem übergeordneten Verzeichnis, bis es auf "/" stößt (oder wie auch immer Sie die Zeichenfolge in der Bedingung der Schleife festlegen). Es wird nicht "/" chmod.

wingedsubmariner
quelle
Schön, ich wusste, dass ich die Dinge mit Perl unnötig kompliziert habe.
Terdon
Aber was ist, wenn fes sich um einen relativen Pfad handelt, und ich möchte anhalten, wozu er relativ ist, anstatt /?
Tim
@ StéphaneChazelas Danke. Wenn $fja foo/bar, wird sich das $fjemals ändern .? Ja dirnamemacht es. Vielen Dank
Tim
1
@ Tim konvertieren relativen Pfad in absoluten Pfad vor dem Speichern in f mit dem Befehl "f =` readlink -f <relative_path> `"
Talespin_Kit
6

Mit csh, tcsh, ksh, zsh, bash, fishoder yash -o braceexpand:

sudo chmod +rx /root{,/subfolder1{,/subfolder2{,/subfolderN}}}

Mit zsh:

f=/root/subfolder1/subfolder2/subfolderN
until [[ $f = / ]] {chmod +rx $f; f=$f:h;}

Oder Sie definieren eine Glob-Qualifier-Funktion wie:

explode() {
  reply=()
  until [[ $REPLY = [./] ]] {
    reply+=$REPLY
    REPLY=$REPLY:h
  }
}

Zum Beispiel als:

$ echo chmod +rx subfolder1/subfolder2/subfolderN(+explode)
chmod +rx subfolder1 subfolder1/subfolder2 subfolder1/subfolder2/subfolderN  

Beachten Sie, dass dies chmod +rxvon der umask beeinflusst wird. Wenn umaskdies nicht enthalten ist 007, wird das /rootVerzeichnis für die ganze Welt lesbar und zugänglich, was eine schlechte Idee ist. /rootist in der Regel für die privaten Dinge des Super-Benutzers, es ist eine schlechte Idee, es freizulegen.

Stéphane Chazelas
quelle
Können Sie erklären, was der Leading ,in {,/subfolder}macht?
Terdon
Es wird eine Abwechslung erstellt, bei der die erste Zeichenfolge leer und die zweite leer ist /subfolder. so /root{,/subfolder}produziert /rootund/root/subfolder
Tripleee
Insbesondere ist dies nicht portierbar für POSIXsh
Tripleee
2

Nun, Sie könnten etwas etwas komplexeres machen, wie:

echo "/root/subfolder1/subfolder2/subfolderN" | 
 perl -anF'/' -e 'while($#F>0){@b=join("/",@F);`chmod +rx @b`; pop @F}' 

Ersetzen Sie den chmodAufruf durch Drucken , um zu sehen, was dies bewirkt:

$ echo "/root/subfolder1/subfolder2/subfolderN" | 
 perl -alnF'/' -e 'while($#F>0){@b=join("/",@F);print "chmod +rx @b"; pop @F}' 
chmod +rx /root/subfolder1/subfolder2/subfolderN
chmod +rx /root/subfolder1/subfolder2
chmod +rx /root/subfolder1
chmod +rx /root
terdon
quelle
1

Ich weiß nicht, was Sie versuchen, aber es ist besser, wenn Sie das Rekursive nicht leicht nehmen . Das heißt, lesen Sie die eigentliche Antwort:

Ähm ... warum nicht einfach rekursiv verwenden.

sudo chmod -R +rx /root

Oder wenn es Ihnen nicht gefällt, können Sie chmodmehrere Verzeichnisse angeben:

sudo chamod +rx /root /root/subfolder1 /root/subfolder1/subfolder2 /root/subfolder1/subfolder2/subfolderN
Braiam
quelle
3
Das ist jedoch nicht annähernd der gleiche Vorgang. chmod -R /rootändert alles unter /root- einschließlich regulärer Dateien und aller Verzeichnisse. Die Frage ist, ob nur eine Verzeichniskette geändert werden soll.
200_success
@ 200_success, aber das ist nicht die einzige Antwort;)
Braiam
Die Frage bezieht sich nicht auf die Rekursion, sondern darauf, wie Berechtigungen für eine Kette von übergeordneten Ordnern festgelegt werden, um einen selektiven Zugriff auf einen Unterordner zu ermöglichen. Zu sagen, dass dies nicht die einzige Antwort ist, ist wie zu sagen, dass das Fahren eines Busses durch die Wand eine andere Möglichkeit ist, eine Tür zu bauen.
jmc