Permission denied su Linux: 10 casi, compreso /dev/null
Permission denied è un errore di Linux che compare quando il tuo account attuale non ha il permesso di usare quel file, quella cartella o quel comando. Scegli il tuo caso in base al nome del comando e al percorso all'inizio della riga di errore, controlla permessi e proprietario con ls -l e riesegui con i permessi o l'account giusti per risolvere.
L'output qui sotto proviene dall'account root di un server AlmaLinux 9.8 e da un account normale di un server Debian 12; i nomi di account e di host e gli orari nell'output di /dev/null sono valori di esempio.
1️⃣ Trovare la causa di Permission denied
La riga di errore termina nella forma [comando: destinazione: Permission denied], e il nome del comando e il percorso che la precedono mostrano dove è avvenuto il blocco. Nel diagramma qui sotto, scegli il messaggio di errore simile a quello sul tuo schermo per vedere il comando da controllare per primo e la parte di questo articolo da leggere.
2️⃣ Errori Permission denied frequenti
🔲 Permessi di lettura e scrittura dei file
Per leggere un file l'account ha bisogno del permesso di lettura (r), per modificarlo o crearne uno nuovo del permesso di scrittura (w). secret.txt, con permessi 600, può essere letto e scritto solo dal proprietario, root.
ls -l secret.txt-rw------- 1 root root 16 Oct 29 00:29 secret.txtrunuser -u daemon -- cat secret.txtcat: secret.txt: Permission deniedLeggendo lo stesso file con un altro account, daemon, la lettura è stata rifiutata subito. Creare un file in una cartella senza permesso di scrittura dà lo stesso errore: sul server Debian 12, con un account normale, touch è stato bloccato in una cartella lock con permessi 000.
touch ~/touchtest/lock/x.txttouch: cannot touch '/home/user/touchtest/lock/x.txt': Permission deniedNella prima colonna di ls -l guarda se ci sono r e w per proprietario, gruppo e altri account, in quest'ordine, poi aggiungi permessi solo all'account che ne ha bisogno con chmod oppure cambia il proprietario con chown.
🔲 Permesso di attraversare le cartelle
Anche se i permessi del file sono giusti, non arrivi al file se una cartella a metà del percorso non ha il permesso x. Per una cartella, x è il permesso di attraversarla per entrare, e r è il permesso di leggere l'elenco dei nomi che contiene.
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.htmlLa cartella web ha solo r, quindi daemon ha potuto leggere i nomi al suo interno, css e index.html, ma senza x permessi e dimensioni sono rimasti punti interrogativi. Al contrario, la cartella site, che ha x ma non r, ha bloccato l'elenco, mentre un file di cui si conosceva già il nome si è potuto leggere.
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>Se il percorso è lungo, usa ls -ld per controllare cartella per cartella dall'alto se c'è x, e aggiungi alla cartella bloccata solo la x che serve all'account per attraversarla.
🔲 Permesso di esecuzione
Per eseguire uno script come ./nome del file, il file deve avere il permesso x. deploy.sh, con permessi 644, è stato rifiutato.
ls -l deploy.sh-rw-r--r-- 1 root root 8 Oct 29 00:29 deploy.sh./deploy.shbash: line 1: ./deploy.sh: Permission deniedDopo aver aggiunto x al proprietario con chmod u+x, la prima colonna è diventata [-rwxr--r--].
chmod u+x deploy.shls -l deploy.sh-rwxr--r-- 1 root root 8 Oct 29 00:29 deploy.shSe l'esecuzione viene rifiutata anche con il permesso x, controlla se il file system che contiene il file è montato con noexec.
🔲 Leggere informazioni riservate a root
Un account normale non può leggere le informazioni che il sistema riserva a root, come i processi avviati da root o i dati delle password di altri account. Sul server Debian 12, aprire con un account normale la cartella fd del processo 1 ha dato un errore di permessi.
ls /proc/1/fdls: cannot open directory '/proc/1/fd': Permission deniedchage -l daemonchage: Permission denied.Anche i dati di scadenza della password di un altro account sono stati bloccati per lo stesso motivo; /etc/shadow, che li contiene, è un file che gli utenti normali non possono leggere. Con errori così non allargare i permessi: riesegui il comando con sudo o come root.
🔲 Quando > viene bloccato anche con sudo
sudo esegue come root solo il comando scritto dopo di lui, mentre l'apertura di un file per il reindirizzamento (>) la fa la shell dell'account attuale prima che il comando parta. Per questo, se reindirizzi l'output di sudo echo verso un file che solo root può scrivere, la riga di errore inizia con il nome della shell, nella forma [bash: percorso del file: Permission denied].
sudo echo x > /root/test.txtPer fare come root anche il reindirizzamento, racchiudi l'intera riga in sh -c così che la shell stessa giri con sudo; anche il manuale ufficiale di sudo riporta un esempio di esecuzione dentro sh -c perché il reindirizzamento funzioni.
sudo sh -c 'echo x > /root/test.txt'tee riceve lo standard input e lo scrive direttamente nei file indicati, quindi se esegui tee con sudo, il file lo apre tee con i permessi di root. tee mostra inoltre ancora una volta a schermo ciò che riceve.
echo x | sudo tee /root/test.txt🔲 Accesso SSH rifiutato
Se prima di Permission denied compare [account@indirizzo del server:] e tra parentesi c'è un metodo di autenticazione come publickey, l'accesso è stato rifiutato nella fase di autenticazione, e il punto da controllare è diverso dai permessi dei file. Sul server, sshd ha StrictModes al valore predefinito yes, quindi prima di accettare l'accesso controlla permessi e proprietario della cartella home e dei file di quell'account. Se anche solo uno tra cartella home, cartella ~/.ssh e ~/.ssh/authorized_keys è scrivibile da un altro account, sshd non usa quel file di chiavi; controlla quindi con ls -ld che nessuno dei tre dia il permesso w ad altri account.
⌨️ Simulatore di Permission denied
Il simulatore qui sotto parte dall'account root, e con runuser puoi diventare un altro account, daemon, e vedere da te l'output quando vengono bloccati la lettura dei file, l'attraversamento delle cartelle e il permesso di esecuzione.
3️⃣ Errori Permission denied rari
Se vieni rifiutato anche se i permessi sono giusti, qualcosa fuori dai bit di permesso ha bloccato, come una policy SELinux o un montaggio noexec. Se l'esecuzione viene rifiutata perfino come root, controlla se il file non ha nessun bit x.
Su un server con SELinux attivo compare Permission denied quando una policy SELinux blocca l'azione, anche se i bit di permesso sono giusti; in quel caso controlla prima i registri di rifiuto di SELinux. Sui server dove gira il demone audit, i rifiuti finiscono in /var/log/audit/audit.log come [avc: denied], insieme all'azione bloccata, al nome del comando (comm) e al nome della destinazione (name).
Controlla con getenforce se SELinux è attivo ed esegui ausearch come root per vedere i rifiuti di oggi.
getenforceausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts todayCon il demone rsync, anche il [Permission denied (13)] in ricezione era un caso di SELinux che bloccava l'accesso al percorso del modulo.
Su un file system montato con noexec non si possono eseguire file direttamente, quindi anche se ls -l mostra x vengono rifiutati con [bash: percorso dello script: Permission denied]. Passa la cartella a findmnt -T per vedere dove è montata e con quali opzioni; se tra le opzioni c'è noexec, è questo il caso.
findmnt -T /tmp -o TARGET,OPTIONSroot supera quasi tutti i controlli sui permessi, ma l'esecuzione è consentita solo se almeno uno tra proprietario, gruppo e altri account ha x. Per questo uno script senza alcuna x viene rifiutato anche quando root lo esegue con ./.
Eseguendo con ./ come root deploy.sh, la cui prima colonna era [-rw-r--r-- 1 root root], è comparso [bash: line 1: ./deploy.sh: Permission denied].
🔲 Quando /dev/null è diventato un file normale
Se subito dopo l'accesso SSH con un account normale le righe qui sotto compaiono una dopo l'altra prima del prompt della shell, controlla prima se /dev/null, il dispositivo a caratteri che tutti gli account usano per scartare l'output, è diventato un file normale di proprietà di root. Il numero di righe varia da server a server in base a quanti script profile vengono letti all'accesso, e sullo stesso server l'errore non è comparso dopo il passaggio a 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 prima colonna era [-rw-r--r--] e al posto della dimensione c'era 55: il testo di errore scartato da altri comandi si era accumulato nel file. Se una riga di comandi di pulizia che contiene la forma qui sotto viene eseguita come root, rm cancella il file di dispositivo e il reindirizzamento 2>/dev/null del comando successivo crea con lo stesso nome un nuovo file normale di proprietà di root.
rm -f /dev/null 2>/dev/nullEsegui la riga qui sotto come root. Creando il nuovo dispositivo con un nome accanto e sovrascrivendo poi con mv, non c'è nessun momento in cui il nome manca, quindi tra cancellazione e creazione non resta spazio perché un altro reindirizzamento crei di nuovo un file normale.
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 fileIl [c 1 3] di mknod è il numero di /dev/null nell'elenco dei numeri di dispositivo del kernel. Dopo il ripristino anche echo x > /dev/null con un account normale è terminato senza errori. Anche un riavvio può riportarlo com'era, ma la riga sopra, che non ferma il server, è più veloce.
| Verifica | Prima della correzione | Dopo la correzione |
|---|---|---|
| Prima colonna di ls -l | -rw-r--r-- | crw-rw-rw- |
| Dimensione in ls -l | 55 | 1, 3 |
| stat -c %F | regular file | character special file |
| Scrittura con account normale | Permission denied | Nessun errore |
Manda l'output da scartare solo fino a >/dev/null o 2>/dev/null e, a meno che tu non lo stia ripristinando, non scrivere mai /dev/null come destinazione di rm o mv.
🔢 FAQ & contenuti consigliati
Server web · 403
Errore 403 di Apache dopo l'installazione di APM (403 Forbidden)
Articolo su un caso in cui il server web non riusciva a leggere la cartella web, ha lasciato Permission denied in error_log e ha mostrato 403.
Server web · 503
Errore 503 dopo l'installazione di APM
Articolo che verifica con error.log un caso in cui Apache non riusciva a collegarsi al socket di php-fpm e restituiva 503.
ℹ️ Informativa sull'affiliazione
I contenuti di questo sito includono link di affiliazione. Se un visitatore acquista un prodotto o un servizio tramite uno di questi link, il sito riceve una commissione dal venditore. In questo processo l'importo pagato dall'acquirente (durante le promozioni l'importo scende↓) non aumenta. Prezzi, sconti e disponibilità indicati si riferiscono al momento della stesura e possono differire da quelli reali: prima di acquistare verifica sempre presso il venditore. I prodotti vengono scelti e valutati secondo criteri propri, e le commissioni non influiscono sull'ordine di presentazione né sul contenuto delle valutazioni.