CHMOD - Application de différentes autorisations pour les fichiers et les répertoires

9

J'ai essayé de nettoyer les autorisations sur quelques boîtes et j'ai parcouru l'homme chmod ainsi que toute la documentation Internet que je gère sans aucune chance - alors c'est parti.

Fondamentalement, j'ai un répertoire avec de nombreux sous-répertoires et fichiers - et je voudrais définir les autorisations suivantes:

Pour les répertoires: 770 (u + rwx, g + rwx, o-rwx)

Pour les fichiers: 660 (U + rw, g + rw, ax, o-rw)

Je voudrais essayer de le faire avec un seul chmod récursif si possible - afin d'éviter de récurer dans chaque répertoire et de définir des autorisations fichier par fichier.

J'imagine qu'il doit y avoir un moyen de le faire sans écrire mon propre script shell - mais je n'ai rien trouvé.

J'apprécie ton aide!

Skone
la source

Réponses:

10

Je trouve un script utile car il est souvent utile de modifier à la fois les autorisations de fichier et de répertoire, et elles sont souvent liées. 770 et 660 pour les répertoires partagés sur un serveur de fichiers, 755/644 pour les répertoires de serveur Web, etc. le mode ne s'applique pas.

#!/bin/sh
# syntax: setperm.s destdir
#
if [ -z $1 ] ; then echo "Requires single argument: <directoryname>" ; exit 1 ;                                       fi

destdir=$1

dirmode=0770
filemode=0660

YN=no

printf "\nThis will RECURSIVELY change the permissions for this entire branch:\n                                      "
printf "\t$destdir\n"
printf "\tDirectories chmod = $dirmode\tFiles chmod = $filemode\n"
printf "Are you sure want to do this [$YN]? "

read YN

case $YN in
        [yY]|[yY][eE][sS])
        # change permissions on files and directories.
        find $destdir -type f -print0 | xargs -0 chmod $filemode $i
        find $destdir -type d -print0 | xargs -0 chmod $dirmode $ii ;;

        *) echo "\nBetter safe than sorry I always say.\n" ;;
esac
iPaulo
la source
Hou la la! Ceci est exactement ce que je cherchais. Merci beaucoup!
Skone
Hey iPaulo - pouvez-vous expliquer par hasard le "$ ii" sur la ligne "find $ destdir -type d -print0 | xargs -0 chmod $ dirmode $ ii ;;". Je ne suis pas sûr de comprendre pourquoi ce n'est pas seulement "trouver $ destdir -type d -print0 | xargs -0 chmod $ dirmode $ i ;;" Merci!
Skone
20

Pas besoin de scripts.

// Répertoires:

find . -type d -exec chmod XXX {} \;

// Des dossiers:

find . -type f -exec chmod XXX {} \;
Ensoleillé
la source
17

Dans votre cas, cela pourrait ne pas être aussi compliqué que d'autres l'ont fait croire (bien qu'il s'agisse en findeffet d'un bon outil pour ce genre de chose en général). La différence entre les modes est le bit d'exécution. S'il est vrai qu'aucun fichier n'a déjà le bit d'exécution défini, vous pouvez le faire en une seule invocation de chmod, comme vous l'avez demandé.

chmod -R u=rwX,g=rwX,o= FILE...

La clé ici est le capital X, que la page de manuel explique comme

exécuter / rechercher uniquement si le fichier est un répertoire ou dispose déjà d'une autorisation d'exécution pour un utilisateur.

Ainsi, si vos fichiers n'ont pas déjà le bit d'exécution défini, il ne le sera que pour les répertoires.

Mikael Auno
la source
C'est génial, mais beaucoup plus long que d'écrire 777. Y a-t-il un raccourci pour le -X?
Elliott B
6

J'ai trouvé que pour mon cas d'utilisation au moins, utiliser rsyncpour copier le répertoire sur lui-même était beaucoup plus rapide que d'utiliser chmoddirectement avec une liste de fichiers find.

rsync -rpt --chmod=D770,F660 . .

Si vous souhaitez ajouter un chownà la même opération, rsyncvous pouvez également le faire avec l' --chown=user:groupoption.

Matthew Bush
la source
Whoah, c'est en fait beaucoup plus rapide que chmod -R.
Epeli
Tellement plus rapide que chmod. Y a-t-il des inconvénients à utiliser rsync de cette façon? Je l'ai fait beaucoup et tout semble aller bien.
ours paresseux
1

Propre et simple:

chmod 660 $(find . -type f)
chmod 770 $(find . -type d)
takhin
la source
Approche très élégante.
user5336
3
peut-être, mais notez que cela ne fonctionne que si les fichiers ne contiennent aucun espace. Une approche plus "sûre" estfind ... -exec chmod ... {} \;
isaaclw