Permission denied sous Linux : 10 cas, dont /dev/null
Permission denied est une erreur Linux qui apparaît quand votre compte actuel n'a pas le droit d'utiliser ce fichier, ce dossier ou cette commande. Choisissez votre cas d'après le nom de la commande et le chemin au début de la ligne d'erreur, vérifiez les droits et le propriétaire avec ls -l, puis relancez avec les droits ou le compte adaptés pour régler le problème.
La sortie ci-dessous provient du compte root d'un serveur AlmaLinux 9.8 et d'un compte ordinaire d'un serveur Debian 12 ; les noms de compte et d'hôte ainsi que l'heure dans la sortie de /dev/null sont des valeurs d'exemple.
1️⃣ Trouver la cause de Permission denied
Une ligne d'erreur se termine par la forme [commande: cible: Permission denied], et le nom de la commande et le chemin placés devant indiquent où le blocage a eu lieu. Dans le schéma ci-dessous, choisissez le message d'erreur qui ressemble à celui de votre écran pour voir la commande à vérifier en premier et la partie de cet article à lire.
2️⃣ Erreurs Permission denied fréquentes
🔲 Droits de lecture et d'écriture sur les fichiers
Pour lire un fichier, le compte a besoin du droit de lecture (r) ; pour le modifier ou en créer un nouveau, du droit d'écriture (w). secret.txt, dont les droits sont 600, ne peut être lu et écrit que par son propriétaire, root.
ls -l secret.txt-rw------- 1 root root 16 Oct 29 00:29 secret.txtrunuser -u daemon -- cat secret.txtcat: secret.txt: Permission deniedLa lecture du même fichier avec un autre compte, daemon, a été refusée aussitôt. Créer un fichier dans un dossier sans droit d'écriture donne la même erreur : sur le serveur Debian 12, touch avec un compte ordinaire a été bloqué dans un dossier lock aux droits 000.
touch ~/touchtest/lock/x.txttouch: cannot touch '/home/user/touchtest/lock/x.txt': Permission deniedDans la première colonne de ls -l, regardez si r et w sont présents pour le propriétaire, le groupe et les autres comptes, dans cet ordre, puis ajoutez des droits uniquement au compte qui en a besoin avec chmod, ou changez le propriétaire avec chown.
🔲 Droit de traverser un dossier
Même si les droits du fichier sont corrects, vous ne pouvez pas l'atteindre si un dossier au milieu du chemin n'a pas le droit x. Pour un dossier, x est le droit de le traverser pour entrer, et r le droit de lire la liste des noms qu'il contient.
ls -ld web web/cssdrw-r--r-- 3 root root 35 Oct 29 00:29 web
drw-r--r-- 2 root root 23 Oct 29 00:29 web/cssrunuser -u daemon -- ls -l webls: cannot access 'web/css': Permission denied
ls: cannot access 'web/index.html': Permission denied
total 0
d????????? ? ? ? ? ? css
-????????? ? ? ? ? ? index.htmlLe dossier web n'a que r : daemon a donc pu lire les noms qu'il contient, css et index.html, mais faute de x, les droits et les tailles sont restés des points d'interrogation. À l'inverse, le dossier site, qui a x mais pas r, a bloqué le listage, alors qu'un fichier dont on connaissait le nom a pu être lu.
ls -ld sitedrwx--x--x 2 root root 24 Oct 29 00:29 siterunuser -u daemon -- ls sitels: cannot open directory 'site': Permission deniedrunuser -u daemon -- cat site/index.html<h1>index</h1>Si le chemin est long, vérifiez avec ls -ld chaque dossier depuis le haut pour voir s'il a x, et ajoutez au dossier bloqué uniquement le x dont le compte a besoin pour le traverser.
🔲 Droit d'exécution
Pour lancer un script sous la forme ./nom du fichier, ce fichier doit avoir le droit x. deploy.sh, aux droits 644, a été refusé.
ls -l deploy.sh-rw-r--r-- 1 root root 8 Oct 29 00:29 deploy.sh./deploy.shbash: line 1: ./deploy.sh: Permission deniedAprès avoir ajouté x au propriétaire avec chmod u+x, la première colonne est passée à [-rwxr--r--].
chmod u+x deploy.shls -l deploy.sh-rwxr--r-- 1 root root 8 Oct 29 00:29 deploy.shSi l'exécution est refusée malgré le droit x, vérifiez si le système de fichiers qui contient ce fichier est monté avec noexec.
🔲 Lire des informations réservées à root
Un compte ordinaire ne peut pas lire les informations que le système réserve à root, comme les processus lancés par root ou les informations de mot de passe des autres comptes. Sur le serveur Debian 12, ouvrir le dossier fd du processus 1 avec un compte ordinaire a donné une erreur de droits.
ls /proc/1/fdls: cannot open directory '/proc/1/fd': Permission deniedchage -l daemonchage: Permission denied.Les informations d'expiration du mot de passe d'un autre compte ont été bloquées pour la même raison ; /etc/shadow, qui les contient, est un fichier que les utilisateurs ordinaires ne peuvent pas lire. Pour ce genre d'erreur, n'élargissez pas les droits : relancez la commande avec sudo ou en root.
🔲 Quand > est bloqué malgré sudo
sudo n'exécute en root que la commande écrite après lui, alors que l'ouverture d'un fichier pour une redirection (>) est faite par le shell du compte actuel avant le lancement de la commande. Ainsi, si vous redirigez la sortie de sudo echo vers un fichier que seul root peut écrire, la ligne d'erreur commence par le nom du shell, sous la forme [bash: chemin du fichier: Permission denied].
sudo echo x > /root/test.txtPour faire aussi la redirection en root, entourez toute la ligne de sh -c afin que le shell lui-même s'exécute avec sudo ; le manuel officiel de sudo donne lui aussi un exemple d'exécution dans sh -c pour que la redirection fonctionne.
sudo sh -c 'echo x > /root/test.txt'tee reçoit l'entrée standard et l'écrit directement dans les fichiers indiqués : si vous lancez tee avec sudo, c'est donc tee, avec les droits root, qui ouvre le fichier. tee affiche aussi une fois de plus à l'écran ce qu'il reçoit.
echo x | sudo tee /root/test.txt🔲 Connexion SSH refusée
Si [compte@adresse du serveur:] précède Permission denied et qu'une méthode d'authentification comme publickey figure entre parenthèses, la connexion a été refusée à l'étape d'authentification, et ce qu'il faut vérifier n'est pas du côté des droits de fichiers. Sur le serveur, sshd a StrictModes à sa valeur par défaut yes : avant d'accepter la connexion, il contrôle les droits et le propriétaire du dossier personnel et des fichiers de ce compte. Si un autre compte peut écrire dans un seul des trois, le dossier personnel, le dossier ~/.ssh ou ~/.ssh/authorized_keys, sshd n'utilise pas ce fichier de clés ; vérifiez donc avec ls -ld qu'aucun des trois ne donne le droit w aux autres comptes.
⌨️ Simulateur Permission denied
Le simulateur ci-dessous démarre avec le compte root ; avec runuser, vous pouvez devenir un autre compte, daemon, et voir par vous-même la sortie quand la lecture de fichiers, la traversée de dossiers et le droit d'exécution sont bloqués.
3️⃣ Erreurs Permission denied rares
Si c'est refusé alors que les droits sont corrects, quelque chose a bloqué en dehors des bits de droits, comme une politique SELinux ou un montage noexec. Si l'exécution est refusée même en root, vérifiez si le fichier n'a aucun bit x.
Sur un serveur où SELinux est activé, Permission denied apparaît quand une politique SELinux bloque l'action, même si les bits de droits sont corrects ; dans ce cas, vérifiez d'abord les journaux de refus de SELinux. Sur les serveurs où le démon audit tourne, les refus sont consignés dans /var/log/audit/audit.log sous la forme [avc: denied], avec l'action bloquée, le nom de la commande (comm) et le nom de la cible (name).
Vérifiez avec getenforce si SELinux est activé, puis lancez ausearch en root pour voir les refus du jour.
getenforceausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts todayAvec le démon rsync, le [Permission denied (13)] obtenu en réception venait lui aussi de SELinux, qui bloquait l'accès au chemin du module.
Sur un système de fichiers monté avec noexec, les fichiers ne peuvent pas être exécutés directement : même si ls -l affiche x, ils sont refusés avec [bash: chemin du script: Permission denied]. Donnez le dossier à findmnt -T pour voir où il est monté et avec quelles options ; si noexec figure parmi les options, c'est ce cas.
findmnt -T /tmp -o TARGET,OPTIONSroot passe la plupart des contrôles de droits, mais l'exécution n'est autorisée que si au moins l'un des trois, propriétaire, groupe ou autres comptes, a x. C'est pourquoi un script sans aucun x est refusé même quand root le lance avec ./.
Lancer avec ./ en root deploy.sh, dont la première colonne était [-rw-r--r-- 1 root root], a donné [bash: line 1: ./deploy.sh: Permission denied].
🔲 Quand /dev/null est devenu un fichier ordinaire
Si, juste après une connexion SSH avec un compte ordinaire, les lignes ci-dessous s'affichent à la suite avant l'invite du shell, vérifiez d'abord si /dev/null, le périphérique caractère que tous les comptes utilisent pour jeter la sortie, est devenu un fichier ordinaire appartenant à root. Le nombre de lignes varie selon le serveur, en fonction du nombre de scripts profile lus à la connexion, et sur le même serveur l'erreur n'est pas apparue après le passage en root.
-bash: /dev/null: Permission denied
-bash: /dev/null: Permission denied
-bash: /dev/null: Permission denied
...ls -l /dev/null-rw-r--r-- 1 root root 55 Jan 10 09:00 /dev/nullstat -c %F /dev/nullregular fileLa première colonne était [-rw-r--r--] et l'emplacement de la taille affichait 55 : le texte d'erreur jeté par d'autres commandes s'était accumulé dans le fichier. Si une ligne de commandes de nettoyage contenant la forme ci-dessous est exécutée en root, rm supprime le fichier de périphérique, puis la redirection 2>/dev/null de la commande suivante crée sous le même nom un nouveau fichier ordinaire appartenant à root.
rm -f /dev/null 2>/dev/nullExécutez la ligne ci-dessous en root. En créant le nouveau périphérique sous un nom voisin puis en l'écrasant avec mv, le nom ne disparaît à aucun moment : aucune autre redirection n'a le temps de recréer un fichier ordinaire entre la suppression et la création.
mknod -m 666 /dev/null.new c 1 3 && mv -f /dev/null.new /dev/null && ls -l /dev/nullcrw-rw-rw- 1 root root 1, 3 Jan 10 09:05 /dev/nullstat -c %F /dev/nullcharacter special fileLe [c 1 3] de mknod est le numéro de /dev/null dans la liste des numéros de périphériques du noyau. Après la réparation, echo x > /dev/null avec un compte ordinaire s'est aussi terminé sans erreur. Un redémarrage peut aussi le remettre en place, mais la ligne ci-dessus, qui n'arrête pas le serveur, est plus rapide.
| Vérifier | Avant le correctif | Après la correction |
|---|---|---|
| Première colonne de ls -l | -rw-r--r-- | crw-rw-rw- |
| Taille dans ls -l | 55 | 1, 3 |
| stat -c %F | regular file | character special file |
| Écriture avec un compte ordinaire | Permission denied | Aucune erreur |
Envoyez la sortie à jeter seulement vers >/dev/null ou 2>/dev/null et, sauf pour une réparation, n'écrivez jamais /dev/null comme cible de rm ou de mv.
🔢 FAQ & contenus recommandés
Serveur web · 403
Erreur 403 d'Apache après l'installation d'APM (403 Forbidden)
Un article sur un cas où le serveur web ne pouvait pas lire le dossier web, a laissé Permission denied dans error_log et affiché une erreur 403.
Serveur web · 503
Erreur 503 après l'installation d'APM
Un article qui vérifie avec error.log un cas où Apache ne pouvait pas se connecter au socket php-fpm et renvoyait une erreur 503.
ℹ️ Mention d'affiliation
Le contenu de ce site contient des liens d'affiliation. Lorsqu'un visiteur achète un produit ou un service via l'un de ces liens, le site perçoit une commission du vendeur. Le montant payé par l'acheteur(il baisse lors des promotions ↓), lui, n'augmente pas. Les prix, remises et stocks indiqués correspondent à la date de rédaction et peuvent différer ; vérifiez-les donc auprès du vendeur avant d'acheter. Les produits sont choisis et évalués selon nos propres critères, et les commissions n'influencent ni l'ordre de présentation ni le contenu des évaluations.