Permission denied in Linux: 10 gevallen, inclusief /dev/null
Permission denied is een Linux-fout die verschijnt wanneer je huidige account geen recht heeft om dat bestand, die map of dat commando te gebruiken. Kies je geval aan de hand van de commandonaam en het pad aan het begin van de foutregel, controleer de rechten en de eigenaar met ls -l en voer het opnieuw uit met de juiste rechten of het juiste account om het op te lossen.
De uitvoer hieronder komt van het root-account op een AlmaLinux 9.8-server en van een gewoon account op een Debian 12-server; account- en hostnamen en de tijden in de /dev/null-uitvoer zijn voorbeeldwaarden.
1️⃣ De oorzaak van Permission denied vinden
Een foutregel eindigt in de vorm [commando: doel: Permission denied], en aan de commandonaam en het pad ervoor zie je waar het werd geblokkeerd. Kies in het diagram hieronder de foutmelding die lijkt op die op je scherm, dan zie je welk commando je eerst controleert en welk deel van dit artikel je leest.
2️⃣ Veelvoorkomende Permission denied-fouten
🔲 Lees- en schrijfrechten voor bestanden
Om een bestand te lezen heeft het account het leesrecht (r) nodig, en om het te wijzigen of een nieuw bestand te maken het schrijfrecht (w). secret.txt met rechten 600 kan alleen door de eigenaar root worden gelezen en geschreven.
ls -l secret.txt-rw------- 1 root root 16 Oct 29 00:29 secret.txtrunuser -u daemon -- cat secret.txtcat: secret.txt: Permission deniedToen een ander account, daemon, hetzelfde bestand las, werd dat meteen geweigerd. Een bestand maken in een map zonder schrijfrecht geeft dezelfde fout: op de Debian 12-server werd touch met een gewoon account geblokkeerd in een lock-map met rechten 000.
touch ~/touchtest/lock/x.txttouch: cannot touch '/home/user/touchtest/lock/x.txt': Permission deniedKijk in de eerste kolom van ls -l op volgorde voor eigenaar, groep en overige accounts of r en w aanwezig zijn, en geef daarna alleen het account dat het nodig heeft rechten met chmod of verander de eigenaar met chown.
🔲 Doorgangsrecht voor mappen
Ook als de bestandsrechten kloppen, bereik je een bestand niet als een map halverwege het pad geen x-recht heeft. Bij een map is x het recht om erdoorheen naar binnen te gaan, en r het recht om de lijst met namen erin te lezen.
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.htmlDe map web heeft alleen r, dus daemon kon de namen erin, css en index.html, lezen, maar zonder x bleven de rechten en groottes vraagtekens. Omgekeerd blokkeerde de map site, die x maar geen r heeft, de lijst, terwijl een bestand waarvan de naam al bekend was wel gelezen kon worden.
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>Is het pad lang, controleer dan met ls -ld vanaf boven map voor map of er x is, en geef de geblokkeerde map alleen de x die het account nodig heeft om erdoorheen te gaan.
🔲 Uitvoerrecht
Om een script als ./bestandsnaam uit te voeren, moet het bestand het x-recht hebben. deploy.sh met rechten 644 werd geweigerd.
ls -l deploy.sh-rw-r--r-- 1 root root 8 Oct 29 00:29 deploy.sh./deploy.shbash: line 1: ./deploy.sh: Permission deniedNadat chmod u+x de eigenaar x had gegeven, veranderde de eerste kolom in [-rwxr--r--].
chmod u+x deploy.shls -l deploy.sh-rwxr--r-- 1 root root 8 Oct 29 00:29 deploy.shAls het uitvoeren wordt geweigerd ondanks het x-recht, controleer dan of het bestandssysteem waarop het bestand staat met noexec is aangekoppeld.
🔲 Informatie lezen die voor root is
Een gewoon account kan informatie die het systeem voor root bewaart niet lezen, zoals processen die root heeft gestart of wachtwoordgegevens van andere accounts. Op de Debian 12-server gaf het openen van de fd-map van proces 1 met een gewoon account een rechtenfout.
ls /proc/1/fdls: cannot open directory '/proc/1/fd': Permission deniedchage -l daemonchage: Permission denied.De gegevens over het verlopen van het wachtwoord van een ander account werden om dezelfde reden geblokkeerd; /etc/shadow, waarin die staan, is een bestand dat gewone gebruikers niet mogen lezen. Bij zulke fouten verruim je de rechten niet, maar voer je het commando opnieuw uit met sudo of als root.
🔲 Als > ondanks sudo wordt geweigerd
sudo voert alleen het commando dat erachter staat uit als root, terwijl het openen van een bestand voor omleiding (>) door de shell van het huidige account wordt gedaan voordat het commando draait. Leid je de uitvoer van sudo echo om naar een bestand waarin alleen root mag schrijven, dan begint de foutregel met de shellnaam, in de vorm [bash: bestandspad: Permission denied].
sudo echo x > /root/test.txtOm ook de omleiding als root te doen, zet je de hele regel in sh -c zodat de shell zelf met sudo draait; ook de officiële sudo-handleiding geeft een voorbeeld van uitvoeren binnen sh -c zodat de omleiding werkt.
sudo sh -c 'echo x > /root/test.txt'tee neemt standaardinvoer aan en schrijft die direct naar de bestanden die je opgeeft, dus als je tee met sudo uitvoert, opent tee met root-rechten het bestand. tee toont wat het ontvangt ook nog een keer op het scherm.
echo x | sudo tee /root/test.txt🔲 SSH-aanmelding geweigerd
Staat er [account@serveradres:] voor Permission denied en tussen haakjes een authenticatiemethode zoals publickey, dan is de aanmelding in de authenticatiestap geweigerd en moet je op een andere plek kijken dan bij bestandsrechten. Op de server staat StrictModes van sshd op de standaardwaarde yes, dus controleert sshd voor het accepteren van de aanmelding de rechten en eigenaar van de thuismap en bestanden van dat account. Kan een ander account in een van de drie schrijven, de thuismap, de map ~/.ssh of ~/.ssh/authorized_keys, dan gebruikt sshd dat sleutelbestand niet; controleer dus met ls -ld dat geen van de drie andere accounts het w-recht geeft.
⌨️ Permission denied-simulator
De simulator hieronder start als het root-account, en met runuser word je een ander account, daemon, en zie je zelf de uitvoer wanneer het lezen van bestanden, het doorlopen van mappen en het uitvoerrecht worden geblokkeerd.
3️⃣ Zeldzame Permission denied-fouten
Word je geweigerd terwijl de rechten kloppen, dan blokkeerde iets buiten de rechtenbits, zoals een SELinux-beleid of een noexec-koppeling. Wordt het uitvoeren zelfs als root geweigerd, controleer dan of het bestand helemaal geen x-bit heeft.
Op een server met SELinux ingeschakeld verschijnt Permission denied wanneer een SELinux-beleid de actie blokkeert, ook als de rechtenbits kloppen; controleer in dat geval eerst de weigeringen van SELinux. Op servers waar de audit-daemon draait, worden weigeringen in /var/log/audit/audit.log vastgelegd als [avc: denied], samen met de geblokkeerde actie, de commandonaam (comm) en de doelnaam (name).
Controleer met getenforce of SELinux aan staat en voer als root ausearch uit om de weigeringen van vandaag te zien.
getenforceausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts todayBij de rsync-daemon was de [Permission denied (13)] bij het ontvangen ook een geval waarin SELinux de toegang tot het modulepad blokkeerde.
Op een bestandssysteem dat met noexec is aangekoppeld, kun je bestanden niet direct uitvoeren; ook als ls -l een x toont, worden ze geweigerd met [bash: scriptpad: Permission denied]. Geef de map aan findmnt -T om te zien waar die is aangekoppeld en met welke opties; staat noexec bij de opties, dan is dit het geval.
findmnt -T /tmp -o TARGET,OPTIONSroot passeert de meeste rechtencontroles, maar uitvoeren mag alleen als minstens een van eigenaar, groep of overige accounts x heeft. Daarom wordt een script zonder enige x geweigerd, ook als root het met ./ uitvoert.
Toen root deploy.sh, met als eerste kolom [-rw-r--r-- 1 root root], met ./ uitvoerde, kwam [bash: line 1: ./deploy.sh: Permission denied].
🔲 Als /dev/null een gewoon bestand is geworden
Verschijnen direct na het aanmelden via SSH met een gewoon account de regels hieronder achter elkaar nog voor de shellprompt, controleer dan eerst of /dev/null, het tekenapparaat waarmee alle accounts uitvoer weggooien, een gewoon bestand van root is geworden. Het aantal regels verschilt per server, afhankelijk van hoeveel profile-scripts bij het aanmelden worden gelezen, en op dezelfde server kwam de fout niet meer na het overschakelen naar 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 fileDe eerste kolom was [-rw-r--r--] en op de plek van de grootte stond 55: fouttekst die andere commando's hadden weggegooid, had zich in het bestand opgestapeld. Draait een opruimregel met de vorm hieronder als root, dan verwijdert rm het apparaatbestand, en maakt de 2>/dev/null-omleiding van het volgende commando onder dezelfde naam een nieuw gewoon bestand van root.
rm -f /dev/null 2>/dev/nullVoer de regel hieronder uit als root. Maak je het nieuwe apparaat onder een naam ernaast en overschrijf je daarna met mv, dan is er geen moment waarop de naam ontbreekt, zodat er tussen verwijderen en aanmaken geen gat is waarin een andere omleiding weer een gewoon bestand maakt.
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 fileDe [c 1 3] bij mknod is het nummer van /dev/null in de lijst met apparaatnummers van de kernel. Na het herstel liep ook echo x > /dev/null met een gewoon account zonder fouten. Een herstart kan het ook terugbrengen, maar de ene regel hierboven, die de server niet stopt, is sneller.
| Controleren | Vóór de oplossing | Na de fix |
|---|---|---|
| Eerste kolom van ls -l | -rw-r--r-- | crw-rw-rw- |
| Grootte in ls -l | 55 | 1, 3 |
| stat -c %F | regular file | character special file |
| Schrijven als gewoon account | Permission denied | Geen fout |
Stuur uitvoer die je wilt weggooien alleen naar >/dev/null of 2>/dev/null, en zet /dev/null behalve bij herstel nooit als doel van rm of mv.
🔢 FAQ & aanbevolen content
Webserver · 403
Apache 403-fout na het installeren van APM (403 Forbidden)
Een artikel over een geval waarin de webserver de webmap niet kon lezen, Permission denied in error_log achterliet en 403 gaf.
Webserver · 503
503-fout na het installeren van APM
Een artikel dat met error.log een geval controleert waarin Apache geen verbinding kon maken met de php-fpm-socket en 503 gaf.
ℹ️ Affiliatemelding
De content van deze site bevat affiliatelinks. Koopt een bezoeker via een van deze links een product of dienst, dan ontvangt deze site een commissie van de verkoper. Het bedrag dat de koper betaalt (bij acties gaat het omlaag ↓) wordt daardoor niet hoger. De vermelde prijzen, kortingen en voorraad gelden op het moment van schrijven en kunnen afwijken; controleer ze daarom vóór je aankoop bij de verkoper. Producten worden gekozen en beoordeeld volgens onze eigen criteria, en commissies hebben geen invloed op de volgorde of de inhoud van de beoordelingen.