définir des autorisations de lecture et d'écriture sur le dossier et tous ses répertoires parents

18

J'ai besoin de définir des autorisations de lecture et d'écriture pour l' rootutilisateur sur le répertoire subfolderNet tous ses dossiers parents jusqu'à root.

Je peux le faire à la main:

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

Mais si Nc'est gros je suis fatigué. Comment faire automatiquement par une seule commande?

Maxim Yefremov
la source
Vous ne devriez vraiment pas rendre le /rootmonde lisible.
Stéphane Chazelas

Réponses:

23

Cela peut être fait facilement dans le shell, en commençant dans le sous-répertoire et en remontant:

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

Cela commence avec le fichier / répertoire que vous définissez aussi, et fonctionne sur chaque répertoire parent, jusqu'à ce qu'il rencontre "/" (ou tout ce que vous définissez la chaîne dans la condition de la boucle). Il ne modifie pas "/".

wingedsubmariner
la source
Sympa, je savais que je compliquais inutilement les choses avec Perl.
terdon
Mais que faire si fc'est un chemin relatif, et je veux m'arrêter à quoi il est relatif au lieu de /?
StackExchange for All
@ StéphaneChazelas Merci. Si $foui foo/bar, changera- $ft- il jamais .? Oui dirname. Merci
StackExchange for All
1
@Tim convertit le chemin relatif en chemin absolu avant de le stocker dans f à l'aide de la commande "f =` readlink -f <relative_path> `"
Talespin_Kit
6

Avec csh, tcsh, ksh, zsh, bash, fishou yash -o braceexpand:

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

Avec zsh:

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

Ou vous pouvez définir une fonction de qualificatif glob comme:

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

A utiliser par exemple comme:

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

Notez que cela chmod +rxest affecté par l'umask. Si vous umaskne l'incluez pas 007, cela rendrait le /rootrépertoire lisible et accessible au monde, ce qui est une mauvaise idée. /rootest généralement pour les choses privées du super-utilisateur, c'est une mauvaise idée de l'exposer.

Stéphane Chazelas
la source
Pourriez - vous expliquer ce que le premier ,en {,/subfolder}fait?
terdon
Il crée une alternance où la première chaîne est vide et la seconde est /subfolder; /root{,/subfolder}produit ainsi /rootet/root/subfolder
tripleee
Notamment, ce n'est pas portable pour POSIXsh
tripleee
2

Eh bien, vous pourriez faire quelque chose d'un peu plus complexe comme:

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

Pour voir ce que cela va faire, remplacez l' chmodappel par print:

$ 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
la source
1

Je ne sais pas ce que vous essayez de faire, mais c'est mieux que vous ne prenez pas le récursif à la légère . Cela dit, lisez la réponse:

Umm ... pourquoi ne pas simplement utiliser récursif.

sudo chmod -R +rx /root

Ou si vous ne l'aimez pas, vous pouvez donner chmodplusieurs répertoires:

sudo chamod +rx /root /root/subfolder1 /root/subfolder1/subfolder2 /root/subfolder1/subfolder2/subfolderN
Braiam
la source
4
Ce n'est pas à peu près la même opération, cependant. chmod -R /rootchange tout sous /root- y compris les fichiers normaux et tous les répertoires. La question consiste à modifier une chaîne de répertoires uniquement.
200_success
@ 200_success mais ce n'est pas la seule réponse;)
Braiam
La question ne concerne pas la récursivité, mais comment définir des autorisations sur une chaîne de dossiers parents pour permettre un accès sélectif à un sous-dossier. Dire que ce n'est pas la seule réponse, c'est comme dire que conduire un bus à travers votre mur est une autre façon de faire une porte.
jmc