SysadminGuide

L'antisèche chmod et chown, décodée

Sur cette page
  1. Rendre un script exécutable (le remède au "permission refusée")
  2. Le code des chiffres : pourquoi 755 et 644 reviennent sans arrêt
  3. Changer la propriété avec chown (et le coup du -R sur la racine web)
  4. Permissions récursives sans bousiller vos fichiers
  5. Un mot rapide sur umask
  6. Et après

L'antisèche chmod et chown que vous dégainez vraiment commence par ce que tout le monde google : vous avez lancé un script, Bash a répondu Permission denied, et il vous faut le remède. C'est chmod +x script.sh, vous copiez et vous changez le nom du fichier. À partir de là, cette carte range les recettes par objectif. Les deux nombres à mémoriser sont 755 pour ce qu'on exécute ou visite et 644 pour les fichiers simples qu'on lit seulement. Verrouillez un secret avec chmod 600. Changez la propriété avec chown, et confiez toute une racine web au compte serveur avec chown -R. Lecture vaut 4, écriture vaut 2, exécution vaut 1, additionnés par case, et une fois que ça clique vous arrêtez de mémoriser des nombres magiques.

The short answer

Rendez un script lançable avec chmod +x script.sh, ensuite ./script.sh tourne enfin. Dégainez chmod 755 pour ce qu'on exécute ou visite et chmod 644 pour les fichiers simples qu'on lit seulement. Verrouillez un secret avec chmod 600 secret.key. Confiez toute une racine web au compte serveur avec chown -R www-data:www-data /var/www. Le code des chiffres : lecture vaut 4, écriture vaut 2, exécution vaut 1, additionnés par case.

+xle remède au Permission denied
755 / 644les deux modes à mémoriser
4 2 1lecture, écriture, exécution par case
Carte réponse : chmod +x répare Permission denied, 755 pour ce qu'on exécute et 644 pour les fichiers qu'on lit seulement, chmod 600 pour les secrets, chown -R pour la propriété, et lecture 4 écriture 2 exécution 1.
Les recettes de permissions et de propriété que vous dégainez vraiment, rangées par ce que vous cherchez à faire. PNG

Vous avez récupéré un script. Vous l'avez lancé. Bash vous a répondu "Permission denied" et vous voilà ici. C'est neuf fois sur dix la raison qui pousse les gens à googler chmod, donc la solution à ce problème précis est tout en haut. Vous copiez, vous changez le nom du fichier, c'est réglé. Le truc pénible avec chmod, c'est que c'est deux outils dans un seul manteau : il y a le petit nombre à trois chiffres que tout le monde retient à moitié, et il y a une syntaxe en lettres bien plus propre que presque personne n'utilise. On va faire les deux.

Une carte rapide avant les recettes. chmod change les permissions, ce qu'on peut faire à un fichier. chown change la propriété, à qui le fichier appartient. Deux boulots différents, faciles à confondre. Et les permissions se découpent en trois : l'utilisateur qui possède le fichier, le groupe, et tous les autres (le fameux "other"). Gardez ces deux idées au clair et le reste n'est plus que de la notation.

Rendre un script exécutable (le remède au "permission refusée")

C'est celle-là. Vous avez écrit un fichier .sh, ou vous l'avez tiré d'internet, et le shell refuse net de le lancer. Le fichier n'a juste pas son bit d'exécution, c'est tout. chmod +x script.sh allume ce bit et ./script.sh prend vie. Aucun nombre à chercher, aucune réflexion. Juste +x.

CommandeCe qu'elle fait
chmod +x script.shAjoute l'exécution pour tout le monde, le remède express au "Permission denied"
chmod u+x script.shAjoute l'exécution pour vous seul, le propriétaire, et personne d'autre
chmod u+x,go-w fileLe rendre exécutable par vous et retirer l'écriture au groupe et aux autres d'un coup
chmod -x script.shReprend le bit d'exécution quand vous voulez le tuer

+x tout seul accorde l'exécution aux trois cases à la fois, ce qui convient en général à un script de service dans votre dossier perso. Si vous êtes plus regardant, ou que c'est une machine partagée, u+x ne donne le droit qu'à vous. Franchement, je pars sur +x et je deviens précis seulement quand quelque chose me le réclame. La troisième, u+x,go-w, c'est la syntaxe en lettres qui fait ses muscles : des changements séparés par des virgules, chacun visant une case précise. On va s'appuyer dessus dans une minute.

Terminal montrant chmod +x puis le lancement d'un script, chown -R www-data:www-data sur une racine web, et chmod -R u=rwX,go=rX pour récurser sans marquer chaque fichier exécutable.
Les gestes du quotidien dans l'ordre : allumer le bit d'exécution, réparer la propriété, puis récurser sans dégâts avec le X majuscule. PNG

Le code des chiffres : pourquoi 755 et 644 reviennent sans arrêt

Voici le modèle qui débloque tous les chmod numériques que vous taperez un jour. Chaque permission a une valeur. Lecture vaut 4, écriture vaut 2, exécution vaut 1. On les additionne pour obtenir un chiffre, et on écrit trois chiffres, un par case : utilisateur, groupe, autres. Donc 7 veut dire 4+2+1, tout, rwx. 6 c'est 4+2, lecture et écriture, pas d'exécution. 5 c'est 4+1, lecture et exécution. 4 c'est lecture seule. Voilà toute l'astuce, et une fois que ça clique, vous arrêtez de mémoriser des nombres magiques et vous vous mettez à les lire.

CommandeCe qu'elle fait
chmod 755 filerwx pour vous, rx pour le groupe et les autres. Scripts, binaires, dossiers où l'on entre
chmod 644 filerw pour vous, lecture pour le reste. Le défaut des fichiers normaux
chmod 600 secretrw pour vous, rien pour les autres. Clés, jetons, fichiers de mots de passe
chmod 700 dirrwx pour vous, fermé à tous les autres. Un dossier privé

Pourquoi un dossier a-t-il besoin d'exécution ? Ça semble faux au début. Sur un dossier, le bit d'exécution veut dire "vous avez le droit d'y entrer et d'atteindre ce qu'il y a dedans". Pas de x sur un dossier et vous ne pouvez pas cd dedans, même si vous pouvez techniquement lire son nom. C'est exactement pour ça que 755 revient tant sur les dossiers : le 5 (lecture plus exécution) laisse les gens lister et traverser sans les laisser écrire. Les fichiers n'ont pas besoin de x sauf s'ils sont faits pour tourner, ce qui est toute la raison pour laquelle 644, et pas 755, convient à un texte ou une image.

Vous voulez éviter le calcul mental ? Notre calculateur de permissions chmod transforme des cases à cocher en nombre exact et en commande exacte. Je m'en sers encore quand je suis à moitié endormi et que je me demande si c'était 640 ou 644 que je voulais.

Changer la propriété avec chown (et le coup du -R sur la racine web)

Les permissions décident ce qu'on peut faire. La propriété décide qui le fait. chown réattribue le propriétaire, et au passage le groupe, d'un seul geste. Le cas classique : vous avez copié un site dans /var/www en root, et maintenant le serveur web ne peut pas y écrire parce que root possède tout. Confiez l'arborescence au compte de service et le problème s'évapore.

CommandeCe qu'elle fait
chown user fileChange juste le propriétaire en user, laisse le groupe tranquille
chown user:group fileFixe propriétaire et groupe ensemble avec le deux-points
chown -R www-data:www-data /var/wwwRécursivement, confie tout un arbre au compte du serveur web
chown :group fileChange seulement le groupe, propriétaire intact (notez le deux-points en tête)
chgrp group fileL'outil dédié au groupe seul, même effet que chown :group

Le -R est celui que vous dégainerez sur les racines web, les dossiers de déploiement, tout ce qui a des dossiers imbriqués. Il parcourt tout l'arbre et réattribue chaque fichier et dossier en dessous. C'est puissant et un peu effrayant, ce qui m'amène à l'avertissement que tout le monde apprend à la dure : -R sur le mauvais chemin est une vraie catastrophe. Lancez chown -R vous / avec une espace en trop ou une variable mal tapée et vous venez de réécrire la propriété sur tout le système, ce qui peut casser le login, sudo, tout le bazar. Regardez le chemin deux fois avant d'appuyer sur entrée. Je suis sérieux.

Permissions récursives sans bousiller vos fichiers

Voici où la plupart des gens font un petit dégât discret. Vous avez une arborescence, les permissions sont en pagaille, et vous voulez les réparer en masse. Le réflexe paresseux, c'est chmod -R 755 dir, et ça marche, en quelque sorte, sauf que ça vient de coller le bit d'exécution sur chaque fichier simple là-dedans aussi. Voilà vos fichiers de conf et vos images tous marqués exécutables sans aucune raison. À peu près inoffensif, mais sale, et un linter ou un scan de sécurité vous le reprochera.

CommandeCe qu'elle fait
chmod -R 755 dirMet 755 sur tout, fichiers compris, même ceux qui ne devraient pas tourner
chmod -R u=rwX,go=rX dirLe récursif malin : le X majuscule n'ajoute l'exécution qu'aux dossiers et aux fichiers déjà exécutables
chmod o-rwx fileRetire tout accès aux "autres", laisse utilisateur et groupe tels quels
chmod g+w fileAjoute l'écriture pour le groupe, un réglage courant de dossier partagé

Ce X majuscule est la vedette sous-estimée de tout l'outillage, et presque personne ne sait qu'il existe. Le x minuscule veut dire "exécution, toujours". Le X majuscule veut dire "exécution, mais seulement sur les dossiers, ou sur les fichiers qui avaient déjà un bit d'exécution quelque part". Donc chmod -R u=rwX,go=rX dir donne aux dossiers leur bit de traversée nécessaire et laisse vos fichiers simples tranquilles. Ça répare le dégât exact que crée -R 755. Une fois que vous l'avez utilisé, revenir au 755 à l'aveugle paraît négligent.

Mon avis : chmod 777 est une odeur suspecte, pas une solution, et le X majuscule mérite un post-it. Quand un truc refuse de marcher et qu'un forum vous dit de le chmod 777, par pitié non, ou au moins ne vous arrêtez pas là. 777 veut dire que chaque utilisateur de la machine peut lire, écrire et exécuter ce fichier, ce qui n'est presque jamais ce dont vous avez vraiment besoin et c'est un cadeau pour quiconque fouine. Neuf fois sur dix la vraie solution, c'est la propriété (un chown vers le bon utilisateur) ou un 755 ou 644 raisonnable, pas d'ouvrir les portes en grand. 777 fait disparaître le message d'erreur en faisant en sorte que le système de permissions cesse de compter, et ça, c'est une odeur de sécurité à chaque fois que je le vois dans un tuto. Le revers, ce que j'aimerais que plus de gens dégainent : le X majuscule dans un changement récursif. chmod -R u=rwX,go=rX fait la bonne chose pour les dossiers et les fichiers en une passe, sans dégâts collatéraux. Je suis peut-être un poil trop évangéliste sur une lettre obscure, je l'assume. Mais ça m'a évité de recasser des permissions tellement de fois que je pense sincèrement que c'est le flag le plus sous-utilisé que chmod embarque.

Un mot rapide sur umask

Vous vous êtes déjà demandé pourquoi un fichier tout neuf apparaît en 644 sans que vous touchiez à chmod ? C'est umask. C'est un masque qui soustrait des permissions au défaut au moment où les fichiers sont créés. Un umask typique de 022 retire l'écriture au groupe et aux autres, et c'est comme ça qu'on tombe sur 644 pour les fichiers et 755 pour les dossiers automatiquement. Vous avez rarement besoin de le régler à la main. Sachez juste que c'est la raison pour laquelle vos défauts ont cette tête, et si tout un dossier de nouveaux fichiers sort avec des permissions que vous n'attendiez pas, umask est le suspect habituel. Tapez umask sans argument pour voir la valeur actuelle.

Et après

Voilà l'ensemble qui sert. Allumer le bit d'exécution avec +x, lire les chiffres (4, 2, 1, additionnés par case), dégainer 755 et 644 au réflexe, verrouiller les secrets à 600, réparer la propriété avec chown et son -R, et utiliser le X majuscule pour les jobs récursifs pour ne pas bombarder les fichiers du bit d'exécution. Tenez-vous loin de 777. Ça couvre presque tout ce que je fais avec les permissions dans une semaine normale.

Questions fréquentes

Comment rendre un fichier exécutable sous Linux ?

Lancez chmod +x script.sh, puis exécutez-le avec ./script.sh. Le +x ajoute le bit d'exécution, ce qui manque chaque fois que le shell affiche Permission denied sur un script que vous savez correct. Si vous voulez être le seul à pouvoir le lancer sur une machine partagée, utilisez plutôt chmod u+x script.sh, qui accorde l'exécution au propriétaire seul et laisse groupe et autres sans.

Quelle est la différence entre chmod 755 et 644 ?

Les deux viennent du modèle numérique où lecture vaut 4, écriture vaut 2 et exécution vaut 1, additionnés par case pour utilisateur, groupe et autres. 755 c'est rwx pour vous et rx pour tout le monde, donc ça convient aux scripts, aux programmes et aux dossiers où les gens doivent entrer. 644 c'est rw pour vous et lecture pour le reste, sans exécution nulle part, ce qui est l'état des fichiers simples comme les textes et les images. La version courte : 755 si ça tourne ou se traverse, 644 si ça se lit seulement.

À quoi sert chmod 777, et est-ce sûr ?

777 accorde lecture, écriture et exécution au propriétaire, au groupe et à tous les autres, donc chaque compte de la machine peut tout faire à ce fichier. C'est rarement la bonne solution et c'est une erreur de sécurité courante. Quand un truc refuse de marcher, la vraie cause est d'habitude une mauvaise propriété ou un mode trop strict, donc un chown vers le bon utilisateur ou un 755 ou 644 raisonnable règle ça sans ouvrir le fichier au système entier. Voyez un 777 dans un tuto comme un signal d'alarme, pas comme un conseil.

Comment changer le propriétaire d'un fichier ou d'un dossier ?

Utilisez chown user file pour fixer le propriétaire, ou chown user:group file pour fixer propriétaire et groupe ensemble avec un deux-points. Pour toute une arborescence, ajoutez -R, comme dans chown -R www-data:www-data /var/www, le geste habituel pour confier une racine web au compte du serveur. Méfiez-vous du -R : le lancer sur le mauvais chemin, genre la racine du système à cause d'une faute ou d'une espace en trop, peut casser les connexions et sudo, donc vérifiez le chemin avant d'appuyer sur entrée.

Comment poser des permissions récursivement sans rendre chaque fichier exécutable ?

Utilisez chmod -R u=rwX,go=rX dir avec un X majuscule. Le X majuscule n'ajoute le bit d'exécution qu'aux dossiers et aux fichiers déjà exécutables, donc vos fichiers simples restent non exécutables pendant que les dossiers gardent le bit de traversée dont ils ont besoin. Ça évite le dégât que crée chmod -R 755 dir, qui marque chaque fichier exécutable, y compris les confs et les images qui ne devraient jamais tourner. Le x minuscule appliquerait l'exécution à tout, ce que vous cherchez justement à éviter.