Permessi Linux spiegati bene: chmod, chown, ottali e sticky bit senza più misteri

Pubblicato il 13/07/2026 Linux

"Permission denied" è probabilmente il messaggio d'errore più visto da chi amministra sistemi Linux, eppure i permessi restano per molti un mistero fatto di numeri imparati a memoria senza capirli davvero. Vediamo cosa significano chmod, chown, la notazione ottale e il misterioso sticky bit che si vede su /tmp.

Leggere l'output di ls -l

Partiamo dalla base: cosa dice davvero una riga come questa?

$ ls -l file.sh
-rwxr-xr-- 1 marco sviluppatori 1240 lug 10 09:12 file.sh

Il primo carattere indica il tipo (- file normale, d directory, l link simbolico); i successivi 9 caratteri sono tre terne da 3, per proprietario, gruppo e tutti gli altri, ciascuna nell'ordine r (read), w (write), x (execute). Nell'esempio: il proprietario marco può leggere, scrivere ed eseguire; il gruppo sviluppatori può solo leggere ed eseguire; tutti gli altri possono solo leggere.

Cosa significano r, w, x in pratica

Su un file r significa poterne leggere il contenuto, w poterlo modificare o cancellare, x poterlo eseguire (se è uno script o un binario). Su una directory il significato cambia e confonde spesso chi inizia: r permette di elencare i file contenuti (ls), w di crearne o cancellarne al suo interno, x di entrarci (cd) e accedere ai file se se ne conosce il nome. Una directory con r-x ma senza w permette quindi di navigarla e leggere i file esistenti, ma non di aggiungerne di nuovi o cancellarli.

La notazione ottale: perché 755 e 644 sono ovunque

Ogni permesso ha un peso numerico: r=4, w=2, x=1. Sommando i pesi della terna si ottiene una cifra da 0 a 7:

rwx = 4+2+1 = 7
rw- = 4+2   = 6
r-x = 4+1   = 5
r-- = 4     = 4
--- = 0     = 0

Tre cifre, una per proprietario/gruppo/altri, danno il numero ottale completo:

chmod 755 script.sh   # rwxr-xr-x: eseguibile per tutti, scrivibile solo dal proprietario
chmod 644 pagina.html # rw-r--r--: modificabile solo dal proprietario, leggibile da tutti
chmod 600 chiave.pem  # rw-------: solo il proprietario può leggere e scrivere
chmod 700 privato.sh  # rwx------: solo il proprietario fa tutto

600 è lo standard per chiavi private SSH e file con credenziali: se i permessi sono troppo aperti, ssh stesso rifiuta di usare la chiave.

chmod in notazione simbolica

Quando vuoi modificare un solo permesso senza ricalcolare il numero ottale intero, la notazione simbolica è più chiara:

chmod u+x script.sh     # aggiungi execute al proprietario (user)
chmod g-w file.txt      # togli write al gruppo
chmod o=r file.txt      # imposta gli altri (other) a sola lettura
chmod a+r file.txt      # aggiungi read a tutti (all)
chmod -R u+rwX cartella # ricorsivo: X aggiunge execute solo a directory e file già eseguibili

La X maiuscola in u+rwX è una finezza utile: a differenza di x minuscola, non rende eseguibili file di testo qualsiasi, ma preserva l'attributo di esecuzione dove serve (directory, script già marcati eseguibili).

chown e chgrp: chi possiede cosa

I permessi si applicano in base a proprietario e gruppo del file: cambiarli è compito di chown e chgrp (servono privilegi root).

sudo chown marco file.txt              # cambia solo il proprietario
sudo chown marco:sviluppatori file.txt # cambia proprietario e gruppo insieme
sudo chgrp sviluppatori file.txt       # cambia solo il gruppo
sudo chown -R www-data:www-data /var/www/sito # ricorsivo

Un caso pratico comune: una cartella condivisa da più utenti dello stesso gruppo, dove tutti devono poter scrivere.

sudo groupadd condivisa
sudo usermod -aG condivisa marco
sudo usermod -aG condivisa laura
sudo chown -R :condivisa /srv/progetto
sudo chmod -R 2775 /srv/progetto

Il 2 davanti a 775 è il setgid sulla directory: ogni nuovo file creato dentro erediterà automaticamente il gruppo condivisa, invece del gruppo primario di chi lo crea. Senza setgid, ogni utente creerebbe file con il proprio gruppo personale e la condivisione si romperebbe silenziosamente.

umask: i permessi di default alla creazione

umask definisce quali permessi vengono tolti automaticamente ai nuovi file e directory. Con umask 022 (valore tipico), un file appena creato parte da 666 e diventa 644; una directory parte da 777 e diventa 755. Per un ambiente più restrittivo, utile su server condivisi:

umask 027   # nessun permesso per "altri", solo lettura per il gruppo

Il quarto bit: setuid, setgid e sticky bit

Oltre alle tre terne classiche esiste un quarto bit speciale, quello rappresentato dalla cifra iniziale extra nella notazione ottale (es. 2775 visto sopra, o 4755, 1777).

  • setuid (4) — su un eseguibile, il processo gira con i permessi del proprietario del file invece che di chi lo lancia. È il meccanismo dietro passwd, che deve scrivere in /etc/shadow anche se lanciato da un utente normale.
  • setgid (2) — su un file eseguibile, gira con i permessi del gruppo proprietario; su una directory, come visto sopra, fa ereditare il gruppo ai nuovi file creati dentro.
  • sticky bit (1) — su una directory, permette di cancellare o rinominare solo i file di cui si è proprietari, anche se la directory è scrivibile da tutti.

L'esempio più famoso di sticky bit è /tmp:

$ ls -ld /tmp
drwxrwxrwt 10 root root 4096 lug 13 08:00 /tmp

Quella t finale al posto della x è lo sticky bit: chiunque può scrivere file in /tmp (permessi 777), ma nessuno può cancellare i file di un altro utente, solo i propri. Per impostarlo su una cartella condivisa:

chmod +t /srv/upload
chmod 1777 /srv/upload   # equivalente in notazione ottale

Un ultimo strumento: le ACL

Quando i tre livelli proprietario/gruppo/altri non bastano (serve dare permessi a un utente specifico senza cambiare gruppo), entrano in gioco le ACL, uno strato aggiuntivo sopra i permessi classici:

getfacl file.txt
setfacl -m u:laura:rw file.txt