chmod: la suppression récursive de l'autorisation “x” borks totalement les autorisations

1

J'ai un dossier avec un contenu (trois fichiers et un dossier) qui ressemble à ceci:

-rwxr-xr-x 1 max max 14504 2011-05-31 16:55 main.css
-rwxr-xr-x 1 max max  2504 2011-05-31 16:55 reset.css
-rwxr-xr-x 1 max max   916 2011-05-31 16:55 scaffold.css
drwxrwxr-x 3 max max  4096 2011-05-31 16:55 ui-lightness

Je veux ajouter un groupe d'écriture à tous et supprimer le statut d'exécutable pour tous les utilisateurs. Je fais les fichiers d'abord:

$ chmod g+w main.css reset.css scaffold.css 
$ chmod a-x main.css reset.css scaffold.css 
$ ls -l
total 28
-rw-rw-r-- 1 max max 14504 2011-05-31 16:55 main.css
-rw-rw-r-- 1 max max  2504 2011-05-31 16:55 reset.css
-rw-rw-r-- 1 max max   916 2011-05-31 16:55 scaffold.css
drwxrwxr-x 3 max max  4096 2011-05-31 16:55 ui-lightness

Jusqu'ici tout va bien. Maintenant, le dossier ui-lightness a déjà écrit en groupe, je veux donc simplement supprimer le statut exe de celui-ci et de tous les fichiers et sous-dossiers qu'il contient.

$ ls -l ui-lightness/
total 40
drwxrwxr-x 2 max max  4096 2011-05-31 16:55 images
-rwxrwxr-x 1 max max 34146 2011-05-31 16:55 jquery-ui-1.8.11.custom.css

$ chmod -R a-x ui-lightness/
chmod: cannot access `ui-lightness/jquery-ui-1.8.11.custom.css': Permission denied
chmod: cannot access `ui-lightness/images': Permission denied

$ ls -l ui-lightness/
ls: cannot access ui-lightness/jquery-ui-1.8.11.custom.css: Permission denied
ls: cannot access ui-lightness/images: Permission denied
total 0
d????????? ? ? ? ?                ? images
-????????? ? ? ? ?                ? jquery-ui-1.8.11.custom.css
$ 

Mon premier instinct est de paniquer un peu. Mais, rajouter le statut x le corrige!

$ chmod -R a+x ui-lightness/

$ ls -l ui-lightness/
total 40
drwxrwxr-x 2 max max  4096 2011-05-31 16:55 images
-rwxrwxr-x 1 max max 34146 2011-05-31 16:55 jquery-ui-1.8.11.custom.css

Quelqu'un peut-il expliquer ce qui se passe ici? Et comment je supprime le statut de l'exécutable sans tout casser? Ceci est dans Ubuntu 9.10 au cas où cela serait pertinent.

à la vôtre, max

Max Williams
la source

Réponses:

8

Le premier paramètre de votre chmod récursif est le répertoire lui-même. Vous avez supprimé le bit x du répertoire, ce qui le rend impossible à rechercher (c'est ce que fait le bit x pour un répertoire). Ensuite, le programme chmod ne peut plus rechercher dans ce répertoire et vous obtenez les erreurs d'autorisations. essayez plutôt ce qui suit.

chmod -R a-x ui-lightness/*
Keith
la source
ahhh - les répertoires doivent donc avoir la propriété x alors? Je ne le savais pas. Merci!
Max Williams
Mais alors, si je le fais chmod -R a-x ui-lightness/*, et il y a un autre sous-répertoire à l'intérieur de cela, alors cette subdir va se faire cogner, non?
Max Williams
5
Oui. Vous devriez vraiment utiliser find . -type f -exec chmod -x {} \; sélectionner uniquement les fichiers normaux.
Keith
8

Pour supprimer le statut de l'exécutable uniquement pour les fichiers, utilisez:

$ chmod -R a-x+X ui-lightness/

le +X l'option est définie (voir man chmod ) à:

  • définir l'autorisation d'exécution uniquement si le fichier est un répertoire ou s'il dispose déjà d'une autorisation d'exécution pour un utilisateur

Donc, les minuscules -x Cette option supprime d’abord le statut de l’exécutable de tous les fichiers (et des répertoires, bien sûr), puis de la majuscule. +X L'option la réinitialise uniquement pour les répertoires.

Il a un inconvénient mineur: il définit le statut de l’exécutable sur tout sous-répertoires, même à ceux qui ne l’avaient pas défini avant la chmod invocation. Si ce n'est pas ce que vous voulez, utilisez simplement Keith find Solution.

charlie
la source
cela fonctionne parfaitement avec les répertoires imbriqués!
Hugo Dozois