Tutoriel Linux

Chmod récursif sous Linux : la commande qui peut vite faire des dégâts

Débutant6 min de lecture
À retenirLinux n'est pas réservé aux experts. Le bon point de départ : une distribution accessible, une sauvegarde propre et quelques commandes comprises.

chmod -R est une commande très pratique sous Linux. Elle permet de modifier les droits d’un dossier et de tout ce qu’il contient. Le problème, c’est justement le tout. Une commande lancée un peu trop vite peut rendre des fichiers exécutables, ouvrir des dossiers sensibles ou casser une application web.

Dans ce guide, on va voir comment utiliser chmod en récursif sans faire n’importe quoi : comprendre les droits, tester sur un dossier limité, séparer les fichiers et les dossiers, et éviter le fameux 777 lancé partout. C’est le genre de commande que je préfère préparer deux minutes plutôt que réparer pendant une heure.

À quoi sert chmod sous Linux ?

chmod modifie les permissions d’un fichier ou d’un dossier. Ces permissions indiquent qui peut lire, écrire ou exécuter un élément : le propriétaire, le groupe et les autres utilisateurs.

ls -l fichier.txt
-rw-r--r-- 1 nathan nathan 1200 juin 29  fichier.txt

Dans cet exemple, le propriétaire peut lire et écrire. Le groupe et les autres utilisateurs peuvent seulement lire. Pour changer ces droits, vous pouvez utiliser une notation symbolique ou numérique.

chmod u+x script.sh
chmod 644 fichier.txt
chmod 755 dossier

La page de manuel chmod(1) détaille toutes les options. Pour un usage quotidien, retenez surtout que les droits ne doivent pas être appliqués au hasard. Un fichier de configuration, un script et un dossier web n’ont pas les mêmes besoins.

Ce que change l’option -R

L’option -R signifie récursif. Elle applique la modification au dossier indiqué, puis à tous ses sous-dossiers et fichiers.

chmod -R 755 /var/www/site

Cette commande peut sembler correcte, mais elle rend aussi les fichiers simples exécutables. Sur un site web, ce n’est généralement pas ce que vous voulez. Un dossier doit souvent être traversable, donc avec le droit d’exécution. Un fichier HTML, CSS ou PHP n’a pas besoin de devenir exécutable pour autant.

Avant de lancer une commande récursive, affichez toujours un aperçu du dossier concerné :

pwd
ls -la
find /var/www/site -maxdepth 2 -type d | head
find /var/www/site -maxdepth 2 -type f | head

Si vous n’êtes pas certain du chemin, ne lancez pas chmod -R. Vérifiez d’abord. Une faute dans /var/www/site, /home ou un dossier monté peut toucher beaucoup plus de fichiers que prévu.

Pourquoi chmod 777 est rarement une bonne réponse

chmod 777 donne lecture, écriture et exécution à tout le monde. C’est tentant quand une application répond Permission denied. C’est aussi une très mauvaise habitude sur un serveur.

chmod -R 777 dossier

Cette commande peut masquer le vrai problème : mauvais propriétaire, mauvais groupe, dossier d’écriture mal ciblé, service lancé avec un autre utilisateur. Sur un serveur web, elle peut autoriser l’écriture là où elle ne devrait pas exister.

Avant de changer les permissions, regardez le propriétaire et le groupe :

ls -ld dossier
ls -l dossier | head

Si le problème vient du propriétaire, c’est parfois chown qu’il faut corriger, pas chmod. J’ai déjà détaillé ce point dans le guide sur le changement de propriétaire avec chown sous Linux.

Appliquer des droits différents aux dossiers et aux fichiers

Dans beaucoup de cas, la méthode propre consiste à traiter les dossiers et les fichiers séparément. Exemple courant pour un site ou un projet classique :

find /var/www/site -type d -exec chmod 755 {} ;
find /var/www/site -type f -exec chmod 644 {} ;

La première commande applique 755 aux dossiers. La seconde applique 644 aux fichiers. C’est plus long à écrire que chmod -R 755, mais c’est beaucoup plus propre.

Vous pouvez d’abord tester la sélection sans modifier les droits :

find /var/www/site -type d | head -20
find /var/www/site -type f | head -20

Si la liste ne correspond pas à ce que vous attendez, arrêtez-vous là. Corrigez le chemin ou ajoutez des exclusions avant de toucher aux permissions.

Utiliser la notation symbolique pour limiter le risque

La notation symbolique est souvent plus sûre quand vous voulez ajouter ou retirer un droit précis. Par exemple, pour retirer l’écriture aux autres utilisateurs :

chmod -R o-w dossier

Pour ajouter l’exécution uniquement aux dossiers, utilisez plutôt find :

find dossier -type d -exec chmod u+x {} ;

Vous pouvez aussi ajouter un droit au groupe sans réécrire toute la combinaison numérique :

chmod -R g+rw dossier

Cette syntaxe évite parfois de remplacer des droits déjà corrects par un modèle trop large. Sur un dossier partagé entre plusieurs utilisateurs, c’est souvent plus lisible.

Cas pratique : corriger un dossier web sans tout ouvrir

Imaginons un site dans /var/www/site. Les fichiers doivent être lisibles par le serveur web, les dossiers traversables, mais vous ne voulez pas ouvrir l’écriture à tout le monde.

sudo find /var/www/site -type d -exec chmod 755 {} ;
sudo find /var/www/site -type f -exec chmod 644 {} ;

Si un dossier doit vraiment être accessible en écriture par l’application, ciblez-le explicitement. Par exemple un dossier de cache ou d’uploads :

sudo chmod 775 /var/www/site/wp-content/uploads

Mais ne transformez pas toute l’arborescence en zone d’écriture. Si l’application a besoin d’écrire partout, le vrai problème est probablement ailleurs : propriétaire, groupe, configuration du service, ou méthode de déploiement.

Sur un serveur distant, gardez une session SSH ouverte quand vous touchez aux droits. Si vous modifiez des droits autour de ~/.ssh, soyez encore plus prudent : un mauvais mode peut empêcher l’authentification par clé.

Vérifier les droits après la commande

Après un changement récursif, vérifiez quelques fichiers et dossiers représentatifs. Ne vous contentez pas du message de retour de la commande.

find /var/www/site -maxdepth 2 -type d -printf '%m %pn' | head
find /var/www/site -maxdepth 2 -type f -printf '%m %pn' | head

Si vous avez corrigé un problème de service, relancez le test qui échouait. Pour un site web, contrôlez aussi les logs :

systemctl status nginx --no-pager
journalctl -u nginx -n 80 --no-pager

Adaptez évidemment le nom du service : apache2, php-fpm, nginx ou autre. Si vous avez surtout un doute général sur les permissions Linux, le guide sur les utilisateurs et permissions sous Linux peut compléter cette méthode.

Ma règle simple : chmod -R se lance seulement quand le chemin est confirmé et que l’effet attendu est clair. Pour le reste, find permet de cibler proprement les dossiers, les fichiers, ou un sous-dossier précis. C’est moins spectaculaire, mais ça évite les dégâts.

sudo apt update && sudo apt upgrade