Ok, j'ai relu les pages de manuel "chmod" pour Mac OS X, BSD et Linux, et ai fait quelques expériences. Voici ce que j'ai appris sur les modes symboliques. Cela peut devenir compliqué, mais cela vaut la peine de comprendre:
- La forme générale est clause [, clause …] où:
- clause : = [ugoa] [+ - =] [rwxXstugo]
- [ugoa] ( who ) (spécifiez multiple) signifie que vous définissez les droits d’utilisateur, de groupe, d’autre ou de tous. Si non spécifié, la valeur par défaut est 'a', mais umask est en vigueur.
- [+ - =] ( action ) (en spécifier un) signifie:
- + signifie ajouter les autorisations spécifiées aux autorisations déjà en vigueur
- - signifie supprimer les autorisations spécifiées des autorisations déjà en vigueur
- = signifie définir les autorisations sur les autorisations spécifiées, en effaçant toutes les autres
- [rwxXstugo] ( permission ) (spécifiez plusieurs rwxXst ou un ugo) définit les autorisations pour le ou les utilisateurs spécifiés comme suit:
- r - lire
- w - écrire
- x - exécuter / rechercher
- X - exécuter / rechercher dans le répertoire OU n'importe quel bit d'exécution a déjà été défini.
- s - suid ou sgid
- t - collant
- u - copier l'autorisation de l'utilisateur
- g - copier l'autorisation du groupe
- o - copier une autre permission
Ainsi, par exemple, a+x
rendrait un fichier exécutable par tout le monde. a+X
ferait un fichier exécutable par tout le monde SI il avait été exécutable par n'importe qui.
a+x
rendrait un répertoire consultable par tout le monde. a+X
rendrait également un répertoire consultable par tout le monde.
La principale différence entre BSD et Linux réside dans le fait qu’avec BSD, la détermination est effectuée en fonction des autorisations du fichier avant l’ exécution de chmod. Sous Linux, la détermination est faite immédiatement avant que la clause + X soit exécutée.
Ainsi, avec BSD, la combinaison a-x,a+X
supprime les droits d’exécution / de recherche, puis permet à tout le monde de rechercher un répertoire, et rend un fichier exécutable par tout le monde s’il avait été à l’origine exécutable par qui que ce soit.
Avec Linux, a-x,a+X
supprimerait l’autorisation d’exécution / recherche, puis rendrait un répertoire accessible à tous, tout en laissant un fichier exécutable par personne.
Voici un exemple concret: sur une machine BSD: un répertoire, un fichier exécutable et un fichier non exécutable:
drwxr-x--- 2 falk staff 68 Jul 19 18:01 fee/
-rwxr-x--- 1 falk staff 0 Jul 19 18:01 fie*
-rw-r----- 1 falk staff 0 Jul 19 18:01 foe
Notez que le répertoire et "fie" sont tous deux exécutables / consultables par l'utilisateur, mais pas par les autres.
Maintenant nous exécutons chmod a-x,a+X *
. La première clause supprime le bit execute / search de tous les utilisateurs pour tous les fichiers, mais la seconde clause le rajoute à la fois pour "fee" et "fie". "fee" parce que c'est un répertoire et "fie" parce qu'il avait au moins un bit exécutable pour commencer.
drwxr-x--x 2 falk staff 68 Jul 19 18:01 fee/
-rwxr-x--x 1 falk staff 0 Jul 19 18:01 fie*
-rw-r----- 1 falk staff 0 Jul 19 18:01 foe
J'ai eu le même résultat en exécutant chmod -x+X
.
Conclusion: la solution de Jak Gibb fonctionnera sous Linux, mais pour BSD, vous devrez effectuer deux passages.
Je n'ai pas testé cela sur SVr4 ou d'autres variantes d'Unix.