Permission denied (Bash / Shell)
Soluzione Rapida
L’errore “Permission denied” indica che l’utente corrente non possiede i privilegi necessari per leggere, scrivere o eseguire il file o la directory specificata.
Ecco le soluzioni più comuni per risolvere rapidamente il problema:
Opzione 1: Usa sudo (per operazioni amministrative)
Se stai modificando file di sistema, installando pacchetti o accedendo a directory protette:
sudo <comando>
# Esempio: sudo apt update
Opzione 2: Rendi uno script eseguibile
Se stai cercando di avviare uno script .sh, .py o un binario:
chmod +x script.sh
./script.sh
Opzione 3: Correggi i permessi (chmod) Se non riesci a leggere o scrivere un file, imposta i permessi standard (644 per file, 755 per cartelle):
# Per un file singolo
chmod 644 nome_file
# Per una directory e il suo contenuto
chmod -R 755 nome_cartella
Opzione 4: Cambia il proprietario (chown)
Se il file appartiene a root o a un altro utente ma dovrebbe essere tuo:
sudo chown -R $USER:$USER cartella_o_file
Perché accade questo errore
In sistemi operativi Unix-like (Linux, macOS, BSD), il kernel gestisce l’accesso alle risorse tramite un sistema di permessi basato su tre categorie di utenti e tre tipi di accesso. Quando un processo tenta un’operazione per la quale non ha l’autorizzazione esplicita, il sistema restituisce il codice di errore 13 (EACCES), che la shell traduce in “Permission denied”.
I tre livelli di permessi sono:
- Read (
r): Permesso di leggere il contenuto del file o elencare il contenuto della directory. - Write (
w): Permesso di modificare o cancellare il file, o creare/rimuovere file nella directory. - Execute (
x): Permesso di eseguire il file come programma o di entrare/attraversare la directory (cd).
Questi permessi sono assegnati a tre entità:
- User (u): Il proprietario del file (solitamente chi lo ha creato).
- Group (g): Il gruppo assegnato al file.
- Others (o): Tutti gli altri utenti del sistema.
L’errore si verifica tipicamente quando:
- Si tenta di scrivere in directory di sistema (
/etc,/usr,/var) senza privilegi di root. - Si prova a eseguire uno script che non ha il bit
ximpostato. - Si cerca di accedere a una directory senza avere il permesso di esecuzione (
x) su di essa o su una delle directory padre. - Si tenta di leggere un file (es. chiavi SSH private) che ha permessi troppo restrittivi per l’utente corrente.
Spiegazione Dettagliata
Per diagnosticare esattamente il problema, utilizza il comando ls -l per ispezionare i permessi correnti.
Analisi dei permessi
Esegui:
ls -l script.sh
# Output: -rw-r--r-- 1 user group 0 Jan 1 12:00 script.sh
La stringa dei permessi -rw-r--r-- si legge così:
- Il primo carattere
-indica che è un file (se fossedsarebbe una directory). - I successivi tre caratteri
rw-sono i permessi del Proprietario: Lettura (Yes), Scrittura (Yes), Esecuzione (No). - I successivi tre
r--sono i permessi del Gruppo: Lettura (Yes), Scrittura (No), Esecuzione (No). - Gli ultimi tre
r--sono i permessi per Tutti gli altri: Lettura (Yes), Scrittura (No), Esecuzione (No).
Notazione Ottale vs Simbolica
Quando usi chmod, puoi specificare i permessi in due modi:
- Simbolica:
u(user),g(group),o(others),a(all).chmod +x file(Aggiunge esecuzione a tutti).chmod u+w file(Aggiunge scrittura solo all’utente).
- Ottale: Usa numeri da 0 a 7 per rappresentare la somma dei bit (
r=4,w=2,x=1).7(4+2+1) =rwx(Lettura, Scrittura, Esecuzione).6(4+2) =rw-(Lettura, Scrittura).5(4+1) =r-x(Lettura, Esecuzione).4(4) =r--(Lettura).
Esempi comuni:
- 755:
rwxr-xr-x(Standard per script e directory pubbliche). - 644:
rw-r--r--(Standard per file di configurazione e documenti). - 600:
rw-------(Privato, solo il proprietario può leggere/scrivere. Obbligatorio per chiavi SSH).
Fix on Linux
Su Linux, la gestione dei permessi è fondamentale per la sicurezza e il funzionamento del sistema.
1. Correggere permessi ricorsivamente
Se hai copiato una cartella da un backup o da un altro utente, potresti non averne il possesso. Usa chown ricorsivo:
# Cambia proprietario e gruppo all'utente corrente
sudo chown -R $USER:$USER /path/to/directory
Se i file sono tuoi ma i permessi sono errati (es. non riesci a scrivere):
# Imposta permessi standard per directory (755) e file (644)
find /path/to/directory -type d -exec chmod 755 {} \;
find /path/to/directory -type f -exec chmod 644 {} \;
Nota: Evita chmod -R 777 indiscriminato, è un rischio di sicurezza grave.
2. Permessi Chiavi SSH
Se ricevi “Permission denied (publickey)” o errori relativi a id_rsa, i permessi sono troppo aperti. SSH richiede che le chiavi private siano accessibili solo dall’utente.
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
3. Bit di esecuzione (Shebang)
Per eseguire uno script come ./script.py, il file deve avere:
- Il bit
+x. - Una “shebang” valida nella prima riga (es.
#!/usr/bin/env python3).
chmod +x script.py
./script.py
Se manca la shebang o il bit x, otterrai “Permission denied” o “Exec format error”.
Fix on macOS
MacOS utilizza un sistema ibrido che include i permessi POSIX standard (come Linux) ma aggiunge livelli di sicurezza proprietari come SIP e ACL.
1. Operation not permitted (SIP)
Se anche con sudo ottieni “Operation not permitted”, è probabile che tu stia cercando di modificare directory protette da SIP (System Integrity Protection), come /usr/bin, /sbin o /System.
- Soluzione: Non modificare queste directory. Usa
/usr/local/bino/opt/homebrewper i tuoi binari.
2. Full Disk Access / Privacy
Le app terminale (come iTerm2 o Terminal) necessitano di permessi espliciti per accedere a cartelle come Documents, Desktop o Downloads.
- Vai su System Settings > Privacy & Security > Full Disk Access.
- Aggiungi o abilita il tuo terminale.
3. Attributo “Quarantine”
Se scarichi un binario da internet e ottieni “Permission denied” all’esecuzione, potrebbe essere in quarantena.
# Rimuovi l'attributo di quarantena
xattr -d com.apple.quarantine nome_file
chmod +x nome_file
Fix on Windows (Git Bash / WSL)
L’integrazione tra i permessi Windows (NTFS) e quelli Unix emulati può causare conflitti.
1. WSL (Windows Subsystem for Linux)
In WSL, i file nel filesystem Linux (dentro \\wsl$) supportano i permessi nativi. Tuttavia, i file montati da Windows (/mnt/c/...) ereditano i permessi di Windows.
- Se non riesci a scrivere su un file in
/mnt/c, verifica che il file non sia Read-only nelle proprietà di Windows. - Verifica che il file non sia bloccato da un altro processo Windows (es. Excel o un editor).
2. Git Bash
Git Bash su Windows emula un ambiente Unix ma ha limitazioni. Spesso chmod non ha effetto sui file NTFS a meno che non sia abilitato nel config di git.
Per forzare git a tracciare i cambiamenti di permessi:
git config core.fileMode true
Se ottieni errori di accesso negato, prova ad avviare Git Bash come Amministratore (tasto destro -> “Run as administrator”), ma usa questa opzione con cautela.
Common Variations
bash: ./script.sh: Permission denied: Manca il bit di esecuzione (chmod +x).open: Permission denied: Impossibile aprire il file in lettura (controllar).write error: Permission denied: Impossibile scrivere nel file o reindirizzare l’output (> file.log).cd: permission denied: Manca il permesso di esecuzione (x) sulla directory di destinazione.rsync: failed to set permissions: L’utente remoto non ha i permessi perchownochmodsulla destinazione.
FAQ
Q: Quando è sicuro usare chmod 777?
A: Praticamente mai in un ambiente di produzione o multi-utente. 777 permette a chiunque di leggere, scrivere ed eseguire il file. È un vettore di attacco comune per malware e privilege escalation. Usa 755 per directory/eseguibili e 644 per file dati. Per directory temporanee condivise, considera lo “sticky bit” (chmod +t).
Q: Perché sudo echo "test" > /etc/file mi dà Permission denied?
A: Perché la ridirezione > viene eseguita dalla tua shell prima che sudo venga lanciato. La shell corrente non ha permessi di root.
Soluzione: Usa tee:
echo "test" | sudo tee /etc/file
Q: Come posso eseguire uno script senza renderlo eseguibile?
A: Puoi passare lo script direttamente all’interprete. Questo bypassa la necessità del permesso +x, ma richiede comunque il permesso di lettura r.
bash script.sh
python3 script.py
Q: Perché non riesco a entrare in una directory anche se sono il proprietario?
A: Probabilmente manca il permesso di esecuzione (x) sulla directory. Per le directory, x significa “diritto di attraversamento”.
chmod u+x nome_directory
Q: Che differenza c’è tra sudo e su?
A: sudo esegue un singolo comando con privilegi elevati (di solito root) chiedendo la tua password. su (switch user) cambia il contesto dell’intera shell in un altro utente (di solito root) e richiede la password di quell’utente.
Related Errors
- Linux: command not found - Quando il comando non esiste o non è nel PATH.
- Docker: permission denied - Risolvere problemi di accesso al socket Docker.
- Git: permission denied publickey - Specifico per errori di autenticazione SSH con Git.
- Python: permission denied - Errori
EACCESspecifici in script Python.