chmod 755 ou u+x : modes numérique et symbolique
Comprenez chmod 755, u+x et les formes u/g/o, puis évitez de casser une arborescence avec un mode numérique récursif grâce à X majuscule.
Ce que chmod modifie
chmod modifie les bits de permission d’un fichier ou d’un répertoire. Il accepte ces bits sous l’une de deux notations. La forme numérique est un nombre octal qui remplace tous les bits de permission en une seule fois. La forme symbolique indique une classe d’utilisateurs et un opérateur, puis modifie uniquement les bits indiqués. Les deux formes aboutissent au même appel système. La différence concerne les bits que vous n’avez pas indiqués.
Lire un mode et modifier un mode sont deux opérations différentes. Si les lettres d’un affichage long ne vous sont pas encore familières, commencez par lire ce que signifie drwxr-xr-x, champ par champ. Ce guide se limite à les modifier.
Exécutez toutes les commandes de cette page avec votre utilisateur de connexion habituel. Le compte root contourne ces vérifications : une démonstration des permissions exécutée avec root ne prouve donc rien. Si vous travaillez encore avec root sur un nouveau serveur, créez un utilisateur normal avec le principe du moindre privilège, puis revenez ici.
Mettre en place un environnement de test jetable
cd "$(mktemp -d)"
touch notes.txtmktemp -d crée un répertoire vide sous /tmp et affiche le chemin qu’il a créé. La substitution de commande transmet directement ce chemin à cd. Rien de ce qui suit ne touche à un fichier auquel vous tenez.
Une commande affiche le résultat de chaque modification :
stat -c '%a %A %n' notes.txt%a affiche le mode sous forme de nombre octal, %A affiche le même mode avec les lettres utilisées par une sortie longue, et %n affiche le nom. Dans les blocs suivants, une ligne qui commence par $ correspond à ce que vous saisissez, et la ligne suivante correspond à ce que la commande a affiché. Exécutez-les vous-même. La sortie sur votre machine doit correspondre ligne par ligne, car un mode numérique ne dépend d’aucun élément de votre environnement.
La forme numérique : un chiffre octal par classe
Le premier chiffre concerne le propriétaire du fichier. Le deuxième concerne le groupe du fichier. Le troisième concerne tous les autres utilisateurs. Chaque chiffre est la somme de plusieurs valeurs, une par bit. Activez un bit à la fois et regardez ce que stat affiche.
$ chmod 400 notes.txt
$ stat -c '%a %A %n' notes.txt
400 -r-------- notes.txt
$ chmod 200 notes.txt
$ stat -c '%a %A %n' notes.txt
200 --w------- notes.txt
$ chmod 100 notes.txt
$ stat -c '%a %A %n' notes.txt
100 ---x------ notes.txtLes lettres correspondent aux chiffres. Après le caractère initial indiquant le type de fichier, le premier groupe de trois lettres appartient au propriétaire, les trois suivants au groupe et les trois derniers à tous les autres utilisateurs. Additionnez les valeurs pour combiner plusieurs bits dans une même classe.
$ chmod 600 notes.txt
$ stat -c '%a %A %n' notes.txt
600 -rw------- notes.txt
$ chmod 700 notes.txt
$ stat -c '%a %A %n' notes.txt
700 -rwx------ notes.txt
$ chmod 750 notes.txt
$ stat -c '%a %A %n' notes.txt
750 -rwxr-x--- notes.txtUn mode numérique est absolu. Il écrit les neuf bits à chaque exécution. Il écrit donc aussi une classe à laquelle vous n’aviez pas pensé.
$ chmod 755 notes.txt
$ stat -c '%a %A %n' notes.txt
755 -rwxr-xr-x notes.txt
$ chmod 600 notes.txt
$ stat -c '%a %A %n' notes.txt
600 -rw------- notes.txtLa deuxième commande ne précisait rien pour le groupe ni pour tous les autres utilisateurs, mais leurs bits ont tout de même changé. C’est la caractéristique de la forme numérique. C’est pourquoi elle ne convient pas pour une petite modification. (chmod gère également les bits setuid, setgid et sticky, qui se trouvent dans un quatrième chiffre placé avant ceux-ci. C’est un autre sujet ; ce guide se limite aux trois premiers.)
La forme symbolique : une classe, un opérateur, puis les bits
Commencez par la classe. u désigne le propriétaire, g le groupe, o tous les autres utilisateurs et a les trois classes à la fois. Indiquez ensuite l’opérateur : + ajoute des bits, - en supprime et = définit cette classe exactement avec les bits indiqués, puis efface les autres bits de cette classe. Indiquez enfin les bits eux-mêmes, avec r, w ou x.
$ chmod 640 notes.txt
$ stat -c '%a %A %n' notes.txt
640 -rw-r----- notes.txt
$ chmod u+x notes.txt
$ stat -c '%a %A %n' notes.txt
740 -rwxr----- notes.txt
$ chmod g-r notes.txt
$ stat -c '%a %A %n' notes.txt
700 -rwx------ notes.txt
$ chmod o=r notes.txt
$ stat -c '%a %A %n' notes.txt
704 -rwx---r-- notes.txtChaque commande ne modifiait qu’une classe et laissait les autres inchangées. Combinez les clauses avec des virgules, sans espaces ; chmod les applique de gauche à droite.
$ chmod u=rw,go=r notes.txt
$ stat -c '%a %A %n' notes.txt
644 -rw-r--r-- notes.txt
$ chmod go= notes.txt
$ stat -c '%a %A %n' notes.txt
600 -rw------- notes.txtgo=, sans rien après le signe égal, retire tous les bits au groupe et à tous les autres utilisateurs. C’est la forme à utiliser pour un fichier que seul son propriétaire peut lire, comme la partie privée d’une paire de clés SSH.
chmod peut également afficher les modifications effectuées. C’est utile dans un script lorsque personne ne surveille l’écran.
chmod -v u+x notes.txt
chmod -v u+x notes.txt-v affiche une ligne pour chaque fichier fourni. Exécutez les deux commandes et comparez les lignes affichées : la première indique le fichier, ainsi que le mode avant et après la modification ; la seconde indique que le mode est conservé, car le bit à ajouter était déjà défini. -c n’affiche une ligne que lorsqu’un fichier a réellement été modifié. C’est donc la meilleure option à conserver dans un journal.
chmod 755 ou u+x : quelle notation utiliser
Partez deux fois du même fichier et comparez ce que chaque notation laisse en place.
$ chmod 640 notes.txt
$ chmod 755 notes.txt
$ stat -c '%a %A %n' notes.txt
755 -rwxr-xr-x notes.txt
$ chmod 640 notes.txt
$ chmod u+x notes.txt
$ stat -c '%a %A %n' notes.txt
740 -rwxr----- notes.txtLes deux commandes ont rendu le fichier exécutable pour son propriétaire. Une seule a conservé les droits des deux autres classes. Utilisez un mode numérique lorsque vous connaissez précisément l’état final souhaité et que vous voulez l’imposer. C’est le cas approprié dans un script de déploiement qui doit produire le même résultat sur une machine que vous n’avez jamais vue. Utilisez un mode symbolique lorsque votre formulation contient ajouter ou supprimer, car la forme numérique ne permet pas de dire laisser cette partie inchangée.
Le mode initial d’un nouveau fichier ne vient pas du tout de chmod. Il provient de l’umask du processus qui a créé le fichier. Exécutez umask et umask -S dans votre propre shell pour voir la valeur active dans ce contexte. Attendez-vous à ce qu’elle diffère selon les distributions, entre votre shell de connexion et un service systemd, ainsi qu’entre deux comptes. L’umask définit le mode de chaque nouveau fichier, et détermine donc l’état initial avant l’exécution de chmod.
Ce que fait le bit d’exécution sur un répertoire
C’est le malentendu qui fait perdre le plus de temps. Pour un fichier ordinaire, le bit d’exécution indique au kernel qu’il peut exécuter le fichier. Un répertoire ne contient aucune instruction : il n’y a donc rien à exécuter. Sur un répertoire, le bit d’exécution autorise la traversée, c’est-à-dire la résolution d’un nom qui s’y trouve. Pour atteindre dir/file, vous devez disposer de ce droit sur dir. Le bit de lecture est un droit distinct : il permet d’afficher les noms contenus dans le répertoire. Vous pouvez avoir l’un sans l’autre, ce qui devient plus facile à comprendre après l’avoir constaté.
$ mkdir vault
$ printf 'hello\n' > vault/secret.txt
$ chmod 600 vault/secret.txt
$ chmod 100 vault
$ echo vault/*
vault/*
$ cat vault/secret.txt
helloLe shell a réaffiché le motif tel quel, car développer vault/* nécessite de lire le répertoire. Un glob sans correspondance est transmis comme du texte littéral au lieu de provoquer une erreur. cat a tout de même fonctionné, car vous avez fourni vous-même le nom et que la traversée était autorisée. Inversez maintenant les deux bits.
$ chmod 400 vault
$ echo vault/*
vault/secret.txt
$ cat vault/secret.txt
cat: vault/secret.txt: Permission deniedLes noms sont visibles, mais pas le contenu. La lecture fournit la liste. L’exécution fournit l’accès. Presque tous les répertoires que vous utilisez nécessitent les deux droits.
$ chmod 500 vault
$ cat vault/secret.txt
helloPourquoi chmod -R avec un mode numérique endommage une arborescence
-R parcourt toute l’arborescence et applique le mode indiqué à chaque élément rencontré. Un répertoire et un fichier de données n’ont pas besoin des mêmes bits. Un seul nombre absolu ne peut donc pas convenir aux deux. Créez une petite arborescence et observez le résultat.
$ mkdir -p site/css
$ touch site/index.html site/css/main.css
$ printf '#!/bin/bash\necho hi\n' > site/deploy.sh
$ chmod 755 site site/css site/deploy.sh
$ chmod 644 site/index.html site/css/main.css
$ stat -c '%a %A %n' site site/css site/index.html site/css/main.css site/deploy.sh
755 drwxr-xr-x site
755 drwxr-xr-x site/css
644 -rw-r--r-- site/index.html
644 -rw-r--r-- site/css/main.css
755 -rwxr-xr-x site/deploy.shC’est la structure attendue pour un répertoire de fichiers statiques. Voici la première erreur récursive.
$ chmod -R 755 site
$ stat -c '%a %A %n' site/index.html site/css/main.css
755 -rwxr-xr-x site/index.html
755 -rwxr-xr-x site/css/main.cssRien ne semble cassé, et c’est justement le problème. Cette erreur est silencieuse. Elle peut donc rester dans des instructions copiées pendant des années. Deux fichiers de données indiquent maintenant qu’ils sont exécutables. Git conserve le bit d’exécution. Votre prochain commit transmet donc cette modification à toutes les personnes qui clonent le dépôt, et rsync ainsi que tar la transmettent à chaque machine vers laquelle vous copiez l’arborescence.
La deuxième erreur récursive est visible immédiatement. Appliquez à un répertoire un mode sans bit d’exécution, et le répertoire devient inaccessible.
$ chmod 644 site
$ stat -c '%a %A %n' site
644 drw-r--r-- site
$ echo site/*
site/css site/deploy.sh site/index.html
$ cd site
bash: cd: site: Permission denied
$ cat site/index.html
cat: site/index.html: Permission deniedLes noms sont toujours listés, car le bit de lecture a été conservé. En revanche, chaque chemin qui traverse le répertoire est fermé, car le bit d’exécution a été supprimé. chmod -R 644 site applique ce changement à tous les répertoires de l’arborescence en une seule commande. Le résultat n’est pas toujours uniforme non plus, car chmod doit parcourir les mêmes répertoires dont il supprime l’accès. Vérifiez donc ce qui a réellement été appliqué avec find site -type d -exec stat -c '%a %n' {} + au lieu de supposer. Restaurez cette modification avant de continuer.
$ chmod 755 site
$ chmod 644 site/index.html site/css/main.css
$ stat -c '%a %A %n' site site/index.html
755 drwxr-xr-x site
644 -rw-r--r-- site/index.htmlUn chmod récursif n’a pas de fonction d’annulation. chmod n’enregistre pas les modes qu’il remplace. La réparation consiste donc à reconstruire vous-même les modes que vous pensez avoir été appliqués auparavant. C’est le même travail lent et incertain que reconstruire des fichiers après un rm -rf accidentel. La leçon est la même : vérifiez la cible d’une commande récursive avant d’appuyer sur Entrée.
Le X majuscule : exécuter sur les répertoires, pas sur chaque fichier
Les modes symboliques acceptent X ainsi que x. X définit le bit d’exécution uniquement là où cela a du sens : sur un répertoire ou sur un fichier ordinaire qui possède déjà un bit d’exécution pour une classe donnée. Cette règle correspond exactement à celle que vous vouliez que -R applique.
$ chmod -R u=rwX,go=rX site
$ stat -c '%a %A %n' site site/css site/index.html site/css/main.css site/deploy.sh
755 drwxr-xr-x site
755 drwxr-xr-x site/css
644 -rw-r--r-- site/index.html
644 -rw-r--r-- site/css/main.css
755 -rwxr-xr-x site/deploy.shUne seule commande a suffi : les répertoires sont restés traversables et les fichiers de données n’ont pas été modifiés. Le script a conservé son bit d’exécution parce qu’il en possédait déjà un, ce qui constitue la seconde partie de la règle X. X lit le mode actuel d’un fichier. Un fichier qui a déjà perdu tous ses bits d’exécution ne peut donc pas les récupérer avec cette commande.
$ chmod 644 site/deploy.sh
$ chmod -R u=rwX,go=rX site
$ stat -c '%a %A %n' site/deploy.sh
644 -rw-r--r-- site/deploy.sh
$ site/deploy.sh
bash: site/deploy.sh: Permission denied
$ chmod u+x site/deploy.sh
$ stat -c '%a %A %n' site/deploy.sh
744 -rwxr--r-- site/deploy.sh
$ site/deploy.sh
hiLa même règle fonctionne dans l’autre sens. X étend à une autre classe un bit d’exécution que le fichier possède déjà :
$ chmod go+X site/deploy.sh
$ stat -c '%a %A %n' site/deploy.sh
755 -rwxr-xr-x site/deploy.shLe x minuscule s’utilise donc pour rendre exécutable un fichier donné, tandis que X s’utilise pour parcourir une arborescence. Si vous voulez définir un mode exact selon le type d’élément, plutôt que d’appliquer une règle fondée sur le mode actuel, séparez le parcours avec find.
find site -type d -exec chmod 755 {} +
find site -type f -exec chmod 644 {} +
chmod u+x site/deploy.sh-type d sélectionne les répertoires et -type f sélectionne les fichiers ordinaires. Chaque type reçoit ainsi le mode approprié. -exec ... + regroupe plusieurs chemins dans un seul appel à chmod au lieu de lancer un processus par fichier, ce qui est important dans une arborescence contenant des milliers d’entrées. Le script récupère son bit sur une ligne distincte, volontairement.
Vérifiez le résultat avant de quitter la session
Deux commandes permettent de détecter les erreurs importantes après toute modification récursive. La première liste les répertoires dans lesquels vous ne pouvez plus entrer.
find . -type d ! -perm -u+xLa seconde liste les fichiers que n’importe quel compte de la machine peut modifier.
find . -type f -perm -o+wDans -perm -o+w, le - initial signifie au moins ces bits. La commande correspond donc à un fichier dont la classe o contient le bit d’écriture, quels que soient les autres bits définis. Le résultat attendu est qu’aucune des deux commandes n’affiche quoi que ce soit. Exécutez-les depuis la racine de toute arborescence que vous venez de modifier avec -R. Exécutez aussi stat -c '%a %A %n' sur les quelques chemins que vous vouliez modifier, afin de vérifier que le mode défini est bien celui que le kernel contient réellement.
FAQ
Quelle est la différence entre chmod 755 et chmod u+x ?
Un mode numérique est absolu. Il écrit chaque bit de permission sur le fichier. Les classes auxquelles vous n’avez pas pensé sont donc également réécrites. Un mode symbolique modifie l’existant. u+x ajoute un bit pour le propriétaire et laisse tous les autres bits inchangés. Utilisez la forme numérique lorsque vous connaissez précisément l’état final souhaité pour un fichier. Utilisez la forme symbolique lorsque vous voulez ajouter ou supprimer un élément. Exécutez stat -c '%a %A %n' <file> avant et après l’une ou l’autre commande. La différence apparaît dans la sortie.
Pourquoi chmod -R 755 sur un répertoire de fichiers web est-il une mauvaise idée ?
Parce que -R applique le même mode absolu aux répertoires et aux fichiers ordinaires, alors que ces deux types nécessitent des bits différents. Un répertoire a besoin du bit d’exécution pour être parcouru. Les fichiers de données tels que HTML et CSS n’en ont pas besoin. Les marquer comme exécutables crée une modification que git enregistre dans votre prochain commit et que rsync copie sur la machine suivante. Utilisez chmod -R u=rwX,go=rX <dir> afin que le bit d’exécution soit appliqué uniquement aux répertoires, ou utilisez find avec -type d et -type f afin d’attribuer à chaque type son propre mode.
Que fait le bit d’exécution sur un répertoire ?
Il autorise la traversée, pas l’exécution. Rien, dans un répertoire, ne peut être exécuté. Le bit d’exécution autorise la résolution d’un nom à l’intérieur du répertoire. Vous devez donc l’avoir sur chaque répertoire d’un chemin avant de pouvoir ouvrir le fichier situé à la fin de ce chemin. Le bit de lecture est distinct et autorise l’affichage des noms. Vous pouvez avoir l’un sans l’autre : avec uniquement le bit d’exécution, vous pouvez ouvrir un fichier dont vous connaissez déjà le nom, mais le shell ne peut pas développer un glob dans ce répertoire ; avec uniquement le bit de lecture, vous pouvez voir les noms, mais toute tentative d’en ouvrir un échoue.
Quand dois-je utiliser X majuscule plutôt que x minuscule ?
Utilisez X lorsque la commande est récursive. X définit le bit d’exécution sur les répertoires et sur les fichiers ordinaires uniquement lorsqu’un bit d’exécution est déjà défini. Un seul passage permet ainsi de parcourir une arborescence sans transformer les fichiers de données en programmes. Utilisez x lorsque vous ciblez un seul fichier et que vous voulez modifier ce fichier précisément. Une limite est à retenir : X ne peut pas restaurer un bit d’exécution déjà supprimé partout sur un fichier, car il ne reste plus aucun bit correspondant. Rétablissez-le avec chmod u+x <file>.
chmod modifie-t-il le propriétaire d’un fichier ?
Non. chmod modifie uniquement les bits de permission. La propriété dépend de chown pour l’utilisateur et de chgrp pour le groupe. Attribuer un fichier à un autre utilisateur nécessite root. Cela est important, car les bits sont interprétés par rapport à l’utilisateur et au groupe enregistrés sur le fichier, et non par rapport à la personne qui l’a écrit en dernier. Exécutez stat -c '%U %G %a %n' <file> pour afficher simultanément le propriétaire, le groupe et le mode avant de déterminer laquelle des trois commandes vous devez réellement utiliser.