chmod è il comando usato nei sistemi Unix-like per modificare i bit di permesso di file e directory. Puoi usarlo con una notazione simbolica, come chmod u+x script.sh, oppure con una notazione numerica ottale, come chmod 755 script.sh.

La parte importante, però, non è memorizzare 755 o 644. Prima di cambiare un permesso devi capire chi sta tentando di accedere alla risorsa, quale operazione deve compiere e se il problema riguarda davvero i mode bit. Un Permission denied, infatti, può dipendere anche dal proprietario del file, dalle directory che compongono il percorso, da ACL, dal filesystem o da controlli di sicurezza aggiuntivi.

Se amministri un Ubuntu Server o accedi a una macchina tramite SSH, questa distinzione evita uno degli errori più comuni: rendere un file più permissivo senza avere prima identificato la causa del problema.

Cos’è chmod e cosa modifica davvero

Il nome chmod deriva da change mode. Il comando modifica i file mode bits, cioè i bit che controllano i permessi tradizionali associati a un file o a una directory.

La sintassi GNU di base è:

chmod [OPZIONI] MODALITÀ FILE

La modalità può essere espressa in due forme:

chmod u+x script.sh

oppure:

chmod 755 script.sh

La documentazione GNU Coreutils di chmod supporta entrambe le rappresentazioni: simbolica e numerica ottale.

Per capire cosa stai cambiando devi distinguere tre classi:

  • uuser, il proprietario del file;
  • ggroup, gli utenti appartenenti al gruppo associato al file;
  • oothers, gli altri utenti;
  • aall, cioè tutte e tre le classi.

A ognuna possono essere assegnati i permessi r, w e x.

Proprietario, gruppo e permessi sono cose diverse

chmod non cambia il proprietario di un file e non assegna il file a un altro gruppo.

Per quello esistono altri comandi:

chown utente file
chgrp gruppo file

Questa distinzione è decisiva durante il troubleshooting. Se un processo non riesce a scrivere un file perché il file appartiene all’utente o al gruppo sbagliato, aumentare i permessi può mascherare il problema invece di risolverlo.

Prima di intervenire puoi controllare la situazione con:

ls -l file

Un output come questo:

-rw-r----- 1 mario web 2450 documento.txt

indica, tra le altre cose, che il file appartiene all’utente mario, al gruppo web e ha permessi rw-r-----.

Come leggere i permessi Linux: r, w e x

Una stringa come:

-rwxr-xr--

sembra criptica solo finché non la dividi in blocchi.

Il primo carattere descrive il tipo di oggetto. Per esempio, - indica normalmente un file regolare e d una directory. I nove caratteri successivi sono tre gruppi:

rwx | r-x | r--
 u     g     o

Quindi:

  • il proprietario può leggere, scrivere ed eseguire;
  • il gruppo può leggere ed eseguire;
  • gli altri possono soltanto leggere.

La parte che spesso crea errori è che r, w e x non hanno esattamente la stessa conseguenza su file e directory. La documentazione GNU sui file mode bit distingue esplicitamente i due casi.

PermessoSu un fileSu una directory
rleggere il contenutoelencare i nomi contenuti nella directory
wmodificare il contenutocreare o rimuovere elementi nella directory, insieme ai permessi necessari sul percorso
xeseguire il fileattraversare/cercare la directory e raggiungere gli elementi al suo interno

Questo spiega diversi comportamenti apparentemente strani.

Puoi, per esempio, conoscere il nome di un file ma non riuscire a raggiungerlo se manca il permesso x su una directory del percorso. Al contrario, rendere un singolo file leggibile non garantisce che un utente possa raggiungerlo se una directory superiore blocca l’attraversamento.

Per controllare una directory e non soltanto il file usa:

ls -ld nome-directory

e, quando serve, verifica anche le directory superiori del percorso.

Sintassi di chmod: modalità simbolica e numerica

La modalità simbolica è spesso la scelta migliore quando vuoi modificare soltanto una parte dei permessi esistenti.

La forma generale è:

[ugoa][+-=][rwxXst]

Gli operatori significano:

  • + aggiunge un permesso;
  • - rimuove un permesso;
  • = imposta esattamente i permessi indicati per la classe selezionata.

Per esempio:

chmod u+x script.sh

aggiunge il permesso di esecuzione al proprietario senza riscrivere gli altri bit.

chmod g-w report.txt

rimuove la scrittura al gruppo.

chmod o= file-segreto.txt

rimuove tutti i permessi agli altri utenti.

chmod u=rw,g=r,o= documento.txt

imposta in modo esplicito lettura e scrittura per il proprietario, sola lettura per il gruppo e nessun permesso per gli altri.

La X maiuscola non equivale a x

GNU chmod supporta anche X maiuscola. È particolarmente utile sugli alberi di directory perché aggiunge il permesso di esecuzione/attraversamento solo alle directory o ai file che risultano già eseguibili per almeno una classe.

Per esempio:

chmod -R a+X progetto

non trasforma indiscriminatamente tutti i file ordinari in eseguibili. La regola è documentata nella sezione GNU sulla conditional executability.

È una differenza piccola nella sintassi e molto grande nelle conseguenze.

Come funziona la notazione ottale

Con la modalità numerica ogni permesso ha un valore:

PermessoValore
lettura r4
scrittura w2
esecuzione/ricerca x1
nessun permesso0

Schema dei permessi chmod con r uguale a 4, w a 2 e x a 1 che formano il valore 755
In chmod i valori 4, 2 e 1 rappresentano lettura, scrittura ed esecuzione: combinandoli si ottengono modalità come 755.

I valori si sommano per ottenere una cifra da 0 a 7.

NumeroPermessi
0---
1--x
2-w-
3-wx
4r--
5r-x
6rw-
7rwx

Le tre cifre più comuni rappresentano, nell’ordine:

proprietario | gruppo | altri

Quindi:

chmod 754 file

equivale a:

rwx r-x r--

La specifica GNU delle modalità numeriche chiarisce che il numero viene interpretato in ottale e che la modalità numerica, a differenza di una modifica simbolica come g+w, tende a impostare direttamente il nuovo schema di permessi.

chmod 755, 644, 777, 775 e 666: cosa significano

Valori come 755 e 644 sono comuni perché rappresentano combinazioni utili in molti ambienti. Non sono però impostazioni universali da applicare a ogni file o directory.

ModalitàSimbolicaSignificato pratico tipico
600rw-------solo il proprietario legge e scrive
640rw-r-----proprietario legge/scrive, gruppo legge
644rw-r--r--proprietario scrive, tutti possono leggere
700rwx------accesso completo solo al proprietario
750rwxr-x---proprietario completo, gruppo legge/attraversa
755rwxr-xr-xproprietario completo, gli altri leggono/attraversano
775rwxrwxr-xproprietario e gruppo possono scrivere
666rw-rw-rw-tutti possono leggere e scrivere
777rwxrwxrwxtutti possono leggere, scrivere ed eseguire/attraversare

Quando 644 e 755 hanno senso

In un albero web tradizionale, 644 per molti file e 755 per molte directory sono configurazioni frequenti perché:

  • i file ordinari non hanno normalmente bisogno del bit di esecuzione;
  • le directory richiedono x per poter essere attraversate;
  • solo il proprietario mantiene la scrittura quando gruppo e altri non devono modificare il contenuto.

Ma il valore corretto dipende da ownership, gruppi, processo che deve accedere alla risorsa, filesystem e architettura del server.

Un’applicazione che scrive tramite un gruppo condiviso può richiedere una configurazione differente. Un file che contiene segreti può richiedere 600 o una protezione ancora più specifica. Uno script eseguito direttamente può aver bisogno del bit x.

Perché chmod 777 non dovrebbe essere la soluzione predefinita

chmod 777 assegna lettura, scrittura ed esecuzione a proprietario, gruppo e altri.

chmod 777 directory

può far sparire rapidamente alcuni errori di scrittura, ma spesso lo fa perché ha eliminato una barriera, non perché abbia corretto la causa.

Se la vera anomalia è un proprietario sbagliato, un gruppo configurato male o un processo che opera con un’identità diversa da quella prevista, 777 amplia inutilmente l’accesso.

La domanda corretta non è quindi “quale numero fa funzionare il sito?”, ma:

quale utente o processo deve compiere quale operazione su questa risorsa?

Da lì puoi concedere il minimo accesso realmente necessario.

Esempi pratici di chmod

Vediamo i casi che ricorrono più spesso.

Rendere eseguibile uno script

Se hai creato:

script.sh

e vuoi permettere al proprietario di eseguirlo:

chmod u+x script.sh

Puoi verificare il risultato con:

ls -l script.sh

Se invece imposti:

chmod 755 script.sh

non stai soltanto aggiungendo x al proprietario: stai riscrivendo l’intero schema come rwxr-xr-x.

Quando ti serve una sola modifica, la forma simbolica comunica meglio l’intenzione ed evita di alterare bit non correlati.

Togliere la scrittura a gruppo e altri

chmod go-w file.txt

lascia invariati gli altri permessi e rimuove soltanto w da g e o.

Dare lettura al gruppo senza modificare gli altri

chmod g+r report.txt

Impostare permessi privati per un file

chmod 600 credenziali.txt

Il proprietario può leggere e scrivere; gruppo e altri non hanno accesso attraverso i mode bit tradizionali.

Copiare i permessi di un altro file

Con GNU Coreutils puoi usare:

chmod --reference=file-modello file-destinazione

È utile quando due file devono avere lo stesso mode e vuoi evitare di ricostruire manualmente il valore.

chmod ricorsivo: come usare -R senza modificare tutto alla cieca

L’opzione:

-R

applica la modifica in modo ricorsivo a una directory e al suo contenuto.

Per esempio:

chmod -R 755 progetto

imposta 755 su directory e file dentro progetto.

Ed è proprio qui che nasce il problema: una directory può aver bisogno di x per essere attraversata, mentre un normale file PHP, CSS, immagine o documento spesso non deve diventare eseguibile.

Per questo chmod -R 755 non è una ricetta universale.

Impostare permessi diversi a directory e file con find

Se il tuo scenario richiede realmente directory 755 e file 644, puoi separarli:

find /percorso/progetto -type d -exec chmod 755 {} +
find /percorso/progetto -type f -exec chmod 644 {} +

Prima di lanciare un comando ricorsivo su un ambiente reale, verifica sempre:

pwd

e controlla attentamente il percorso passato a find o al comando che modifica i permessi.

Una buona abitudine è eseguire prima la selezione senza -exec, per vedere quali elementi verranno coinvolti:

find /percorso/progetto -type f

Solo dopo che l’insieme è corretto aggiungi l’azione che modifica i permessi.

Usare X quando vuoi preservare l’eseguibilità dei file

In alcuni casi non vuoi assegnare numeri assoluti a tutto l’albero. La X maiuscola può aiutare perché tratta in modo diverso directory e file già eseguibili.

Per esempio:

chmod -R a+rX progetto

aggiunge lettura a tutti e concede esecuzione/ricerca alle directory e ai file già eseguibili per qualcuno.

Non è un sostituto automatico della coppia 755/644: è un altro strumento, utile quando vuoi modificare i permessi in funzione dello stato e del tipo dell’oggetto.

Attenzione ai symbolic link

Il comportamento dei link simbolici merita prudenza soprattutto nelle operazioni ricorsive. GNU chmod normalmente non modifica i permessi del symlink stesso e distingue il trattamento dei link passati direttamente da quelli incontrati durante una traversata ricorsiva.

Le opzioni -H, -L e -P modificano il modo in cui vengono attraversati i link simbolici insieme a -R. In particolare, seguire symlink dentro un albero modificabile da utenti non fidati può creare rischi perché la traversata può arrivare a target non previsti. La documentazione GNU di chmod descrive esplicitamente questo comportamento.

Se non hai bisogno di seguire link simbolici, non aggiungere opzioni di dereferenziazione “per sicurezza”: prima devi sapere quale gerarchia stai realmente modificando.

Setuid, setgid e sticky bit: la quarta cifra dei permessi

I classici 755 o 644 descrivono i nove bit di permesso ordinari. Esistono però anche tre special mode bit:

  • setuid;
  • setgid;
  • sticky bit.

Nella notazione ottale possono comparire come una quarta cifra iniziale:

Bit specialeValore
setuid4
setgid2
sticky bit1

Un valore come:

4755

contiene quindi setuid più i permessi 755.

Setuid

Su un eseguibile, setuid può fare in modo che il processo assuma come effective user ID quello del proprietario del file.

Proprio perché cambia il contesto con cui viene eseguito un programma, non è un bit da aggiungere per tentativi quando compare un errore di permessi.

Setgid

Su un eseguibile riguarda l’effective group ID. Sulle directory, nei sistemi che supportano il comportamento comune descritto da GNU, setgid è particolarmente utile negli spazi condivisi perché i nuovi elementi possono ereditare il gruppo della directory.

Un esempio simbolico è:

chmod g+s directory-condivisa

Sticky bit

Sulle directory condivise il sticky bit limita chi può eliminare o rinominare gli elementi.

Il caso classico è una directory scrivibile da molti utenti nella quale ciascuno non deve poter eliminare liberamente i file degli altri.

Può essere impostato simbolicamente con:

chmod +t directory

La documentazione GNU sui bit speciali spiega il comportamento di s e t e i relativi limiti.

Umask: perché i nuovi file non nascono tutti con gli stessi permessi

umask e chmod sono collegati, ma non fanno lo stesso lavoro.

La umask influenza i permessi assegnati durante la creazione di nuovi file e directory. chmod, invece, modifica i mode bit di un oggetto che esiste già.

Puoi vedere la umask della shell con:

umask

Una configurazione comune è:

0022

ma non devi assumerla come universale.

C’è inoltre una particolarità importante delle modalità simboliche GNU: quando ometti la classe u, g, o o a, l’effetto considera la umask per i bit interessati.

Per esempio:

chmod +w file

e:

chmod a+w file

non sono necessariamente equivalenti. Nel primo caso le classi non sono specificate e la umask può limitare quali bit vengono modificati; nel secondo a è esplicito.

La documentazione GNU su umask e protezione descrive proprio questa differenza.

Con un mode numerico come:

chmod 644 file

stai invece indicando esplicitamente il mode da impostare: non usare la umask come se fosse un filtro da sottrarre automaticamente al numero passato al comando.

Quando chmod non risolve “Permission denied”

Questo è probabilmente il punto più utile della guida.

Se compare:

Permission denied

non partire da:

chmod 777 ...

Parti dalla diagnosi.

1. Controlla identità, proprietario, gruppo e mode

Verifica chi sei:

id

Poi controlla file o directory:

ls -ld /percorso/risorsa

Per modificare i mode bit devi essere il proprietario della risorsa oppure operare con privilegi adeguati. Non è vero che il comando richieda sempre sudo: dipende da chi possiede il file e dai privilegi del processo che lo esegue.

2. Controlla le directory del percorso

Per raggiungere:

/var/www/esempio/file.txt

non basta guardare file.txt.

Il processo deve poter attraversare le directory rilevanti lungo il percorso. Su Linux il permesso x di una directory funziona come permesso di ricerca/attraversamento; se manca, la risoluzione del pathname può terminare con Permission denied.

3. Verifica se il problema è l’ownership

Se un processo dovrebbe poter scrivere perché appartiene a un determinato utente o gruppo, ma il file è posseduto da identità differenti, il comando giusto potrebbe essere chown o chgrp, non un mode più permissivo.

Non cambiare ownership in modo ricorsivo finché non hai verificato quale utente dovrebbe realmente possedere l’albero: su server e applicazioni web una modifica massiva sbagliata può rompere aggiornamenti, deployment e accesso del web server.

4. Controlla eventuali ACL

I mode bit rwx non sono l’unico sistema di controllo degli accessi disponibile su Linux.

Se il filesystem usa Access Control Lists, puoi ispezionarle, quando il comando è disponibile, con:

getfacl file

Una ACL può contenere regole per utenti o gruppi specifici e una mask che limita i permessi effettivi. Quindi ls -l è il primo controllo, non sempre l’ultimo.

5. Se il problema è l’esecuzione, controlla anche il filesystem

Uno script può avere il bit x e continuare a non essere eseguibile se il filesystem è montato con opzioni che vietano l’esecuzione, come noexec.

In quel caso aggiungere altri bit non rimuove la restrizione del mount.

6. Considera i controlli di sicurezza aggiuntivi

Su alcuni sistemi possono entrare in gioco meccanismi come SELinux o altre policy di sicurezza. Anche in questo caso Permission denied non dimostra da solo che la soluzione sia cambiare il mode numerico.

La sequenza corretta resta:

identità → ownership → permessi del file → permessi del percorso → ACL/policy → applicazione

Solo dopo scegli l’intervento.

chmod su hosting, FileZilla, SFTP e WordPress

Il concetto dei permessi Unix può comparire anche quando non stai lavorando direttamente in una shell.

Con FileZilla, per esempio, alcuni server permettono di modificare i permessi da un’interfaccia grafica. I numeri che vedi — 644, 755 e simili — rappresentano gli stessi mode bit, ma il client non decide quale valore sia corretto per la tua applicazione.

Anche durante un collegamento SFTP puoi incontrare comandi per modificare i permessi dei file remoti. Ancora una volta, protocollo di trasferimento e modello dei permessi sono due livelli diversi: essere autenticato sul server non significa poter modificare qualsiasi file.

E WordPress?

Su WordPress 644 per molti file e 755 per molte directory sono valori comuni in diverse configurazioni, ma non vanno trasformati in una regola universale.

La documentazione ufficiale WordPress sui file permissions mostra esplicitamente che i valori possono variare in funzione della configurazione del server e dell’ownership.

Se il tuo problema è specificamente un sito WordPress, conviene quindi seguire una diagnosi dedicata: nella guida su come correggere gli errori di permessi a file e cartelle in WordPress il contesto applicativo viene trattato separatamente dal funzionamento generale del comando.

Questa separazione è utile anche per la sicurezza: un valore che “funziona” non è necessariamente il valore che dovresti mantenere.

Conclusione

chmod è semplice da digitare ma facile da usare male.

Se devi ricordare un solo metodo, usa questo:

  1. identifica l’utente o il processo che deve accedere alla risorsa;
  2. controlla proprietario e gruppo;
  3. interpreta correttamente r, w e x, soprattutto sulle directory;
  4. scegli tra modalità simbolica e numerica in base a quanto vuoi modificare;
  5. usa la ricorsività solo dopo aver verificato l’insieme dei file coinvolti;
  6. non usare 777 come scorciatoia per diagnosticare un Permission denied.

Per aggiungere un singolo diritto, un comando come:

chmod u+x script.sh

è spesso più preciso di una riscrittura completa dei permessi.

Quando invece devi impostare deliberatamente un mode preciso, valori numerici come:

chmod 644 file
chmod 755 directory

sono leggibili e immediati, purché tu sappia perché quella combinazione è corretta nel contesto in cui la stai applicando.

È questa la differenza tra usare chmod come formula da copiare e usarlo davvero come strumento di amministrazione Linux.