Il programma della riga di comando “chmod”, ab­bre­via­zio­ne di “Change Mode”, è stato in­tro­dot­to all’inizio degli anni 70 con la prima versione del sistema Unix di AT&T. Nei sistemi operativi Unix mul­tiu­ten­te è uti­liz­za­to per assegnare i permessi di accesso nei file system che sup­por­ta­no i classici permessi dei file di Unix. Ciò vale ge­ne­ral­men­te per tutti i file di sistema standard sui derivati comuni di Linux, impiegati per il fun­zio­na­men­to del server. Per le modifiche che devono essere apportate agli attributi di un file tramite chmod è ne­ces­sa­rio essere il pro­prie­ta­rio di questo file o disporre di permessi di root.

Sulla maggior parte dei server web sono in­stal­la­te di­stri­bu­zio­ni del sistema operativo Linux, basato su Unix, come ad esempio Ubuntu. Su tutti i derivati di Unix si è soliti assegnare dei permessi di accesso specifici per file e cartelle, mo­di­fi­ca­bi­li su Linux at­tra­ver­so “chmod”, un programma della riga di comando che si attiva dal terminale tramite l’im­mis­sio­ne del comando omonimo.

Come funziona il comando chmod?

Es­sen­zial­men­te il sistema dei permessi dei file di Unix si basa su classi di utenti e sui permessi di base, assegnati a seconda delle esigenze. Per questo chmod supporta due modalità diverse: la notazione simbolica, at­tra­ver­so lettere, e l’as­se­gna­zio­ne dei permessi di file tramite codici ottali, basati su cifre. Come appena accennato, una modifica dei permessi di accesso tramite il comando chmod può essere eseguita solo dal pro­prie­ta­rio del file o dall’utente root. La sintassi cor­ri­spon­den­te da immettere nella riga di comando è sempre la seguente:

$ chmod options mode file

Al comando chmod segue l’elemento fa­col­ta­ti­vo “options”, con il quale si possono stabilire altre opzioni del comando chmod. L’elemento “mode” cor­ri­spon­de alla maschera dei permessi da applicare al suc­ces­si­vo “file”, cioè al file o alla cartella. Questa maschera fornisce in­for­ma­zio­ni sull’as­se­gna­zio­ne dei nuovi permessi di una classe utente o indica se quelli già assegnati debbano essere revocati.

Quali modalità di chmod esistono?

Come nel file system di Unix, anche su Linux ogni file ha dei propri permessi di accesso e lo stesso vale per le cartelle. L’im­po­sta­zio­ne dei permessi di accesso avviene sempre basandosi su tre classi di utenti:

Pro­prie­ta­rio (user) In genere un utente che crea un file nel file system di Unix viene definito au­to­ma­ti­ca­men­te come “utente” del file. La proprietà può essere cambiata suc­ces­si­va­men­te con il comando “chown”.
Gruppo (group) La classe utente “gruppo” comprende diversi account utente sul server. Nei file di sistema Unix, ogni account viene assegnato au­to­ma­ti­ca­men­te a un gruppo prin­ci­pa­le; anche un’ap­par­te­nen­za ad altri gruppi è possibile. L’as­se­gna­zio­ne dei file a un gruppo può essere con­fi­gu­ra­ta sia dal pro­prie­ta­rio che dall’utente root tramite il comando “chgrp”.
Altri (others) La classe utente “altri” comprende tutti gli utenti, che non sono né pro­prie­ta­ri del file né com­po­nen­ti di un gruppo con i relativi permessi di accesso.

Per l’im­po­sta­zio­ne dei permessi, come appena spiegato, sono di­spo­ni­bi­li due modalità: l'an­no­ta­zio­ne simbolica e l'an­no­ta­zio­ne ottale, le cui basi verranno riassunte in breve nei prossimi paragrafi.

Modalità simbolica

Nella modalità simbolica si assegnano lettere alle diverse classi degli utenti e ai permessi di accesso. Grazie a una com­bi­na­zio­ne di queste lettere si può tran­quil­la­men­te indicare quali permessi devono essere aggiunti o rimossi. La tabella seguente riepiloga le lettere di­stin­ti­ve per gli utenti e i permessi nell’ambito della notazione simbolica:

Lettera per permesso di accesso Si­gni­fi­ca­to
r Permesso di lettura; chiamato anche R-bit
w Permesso di scrittura; chiamato anche W-bit
x Permesso di ese­cu­zio­ne (execute); chiamato anche X-bit
Lettera per classe utente Si­gni­fi­ca­to
u Classe utente “user”, pro­prie­ta­rio
g Classe utente “group”, gruppo
o Classe utente “others”, altri utenti
a “all”; il comando si riferisce a tutte le classi degli utenti

Una volta che la maschera dei permessi è stata creata in base alla notazione simbolica, entrano in campo i seguenti operatori che collegano le ri­spet­ti­ve classi di utenti con i permessi dei file:

+ Con l’operatore “+” vengono assegnati alla classe utente dei nuovi permessi per i file. Solo i permessi dei file coinvolti vengono so­vra­scrit­ti.
- L’operatore “-” revoca il permesso del file a una classe utente.
= L’operatore “=” è uti­liz­za­to se i permessi dei file per una classe utente devono essere stabiliti nuo­va­men­te, in­di­pen­den­te­men­te da quelli pre­ce­den­ti.

Se ad esempio il file “esempio.txt”, in­tro­dot­to sopra, deve essere mo­di­fi­ca­to per fare in modo che non solo il pro­prie­ta­rio (user), ma anche tutti gli altri utenti (group, other) ricevano i permessi di lettura e scrittura, il comando chmod da applicare sarebbe:

$ chmod ugo+rw esempio.txt

In al­ter­na­ti­va è possibile riferirsi a tutte le classi di utenti:

$ chmod a+rw esempio.txt

Il file “esempio.txt”, ri­chia­ma­to dal terminale, mo­stre­reb­be ora, invece che i permessi di accesso originali, i permessi assegnati in questo modo:

Permessi di accesso prima della modifica Comando chmod eseguito Permessi di accesso dopo la modifica
-rw------- a+rw -rw-rw-rw-
user: read, write group: nessun permesso other: nessun permesso a = all + = permesso di accesso da ag­giun­ge­re r = read w = write user: read, write group: read, write other: read, write

Modalità ottale

La notazione simbolica è chiara, ma risulta di­sa­ge­vo­le uti­liz­zan­do­la spesso. Per questo motivo per l’as­se­gna­zio­ne dei permessi di accesso molti am­mi­ni­stra­to­ri ricorrono alla notazione ottale. In questo caso si tratta di una sequenza a tre cifre, in cui ogni posizione rap­pre­sen­ta una classe utente del server. L’an­no­ta­zio­ne ottale si orienta perciò alla sequenza standard:

Posizione della cifra della classe utente Si­gni­fi­ca­to
1 Cor­ri­spon­de alla classe utente “pro­prie­ta­rio“ (user)
2 Cor­ri­spon­de alla classe utente “gruppo“ (group)
3 Cor­ri­spon­de alla classe utente “altri” (others)

Dal valore di ogni cifra risulta quale permesso di accesso è stato assegnato alla singola classe utente. Questo valore si calcola dalla somma dei singoli valori che sono assegnati ai permessi cor­ri­spon­den­ti:

Valore per permesso di accesso Si­gni­fi­ca­to
4 Lettura
2 Scrittura
1 Ese­cu­zio­ne
0 Nessun permesso

Da questa as­se­gna­zio­ne risultano le seguenti com­bi­na­zio­ni di valori per i permessi di accesso:

Valore Permesso/i di accesso
0 Nessuno
1 Solo ese­cu­zio­ne
2 Solo scrittura
3 Scrittura/ese­cu­zio­ne
4 Solo lettura
5 Lettura/ese­cu­zio­ne
6 Lettura/scrittura

L’an­no­ta­zio­ne ottale si può spiegare meglio con un esempio. Partendo dal pre­sup­po­sto che il pro­prie­ta­rio del file di esempio “esempio.txt” abbia in­ten­zio­ne di concedere anche al gruppo “grup­poe­sem­pio” i permessi di lettura, si uti­liz­ze­reb­be il seguente codice ottale:

$ chmod 640 esempio.txt

Con il valore 6 al primo posto della maschera dei permessi il pro­prie­ta­rio mantiene i permessi di accesso massimi: 4 (lettura) + 2 (scrittura). Il secondo valore della maschera di permessi indica i permessi di accesso del gruppo: 4 (lettura). Per gli altri utenti, indicati al terzo posto, non sono previsti permessi, come co­di­fi­ca­to dal valore 0.

Opzioni del comando chmod

Sia che un utente decida di uti­liz­za­re l’an­no­ta­zio­ne simbolica o quella numerica, ha a di­spo­si­zio­ne diverse opzioni per l’as­se­gna­zio­ne dei permessi, che vengono inserite nella riga di comando tra il comando e la maschera dei permessi.

Codice Opzione De­scri­zio­ne
-R recursive La modifica dei permessi riguarda tutti i file e le sot­to­car­tel­le all’interno di una cartella.
-v verbose Dopo aver dato questo comando viene co­mu­ni­ca­ta la diagnosi per tutti i file elaborati.
-c changes Dopo aver dato questo comando viene co­mu­ni­ca­ta la diagnosi per tutti i file che sono stati mo­di­fi­ca­ti.
-f silent I messaggi di errore vengono soppressi.

L’esempio seguente mostra un comando per rendere ricorsiva la modifica dei permessi delle sot­to­car­tel­le e dei file all’interno della cartella:

$ chmod -R 744 cartellaesempio

Per tutti i file e le sot­to­car­tel­le nella directory “car­tel­lae­sem­pio” vale che il pro­prie­ta­rio riceve i permessi di accesso completi (7), mentre i membri del gruppo e gli altri utenti hanno solo il permesso di lettura (4).

Utilizzo di chmod spiegato con un esempio

Per finire, di seguito trovate un esempio concreto che vi spiegherà meglio l’utilizzo di chmod.

Prima di tutto, però, si dovrebbe co­min­cia­re con un controllo generale dei permessi assegnati at­tual­men­te. Nei sistemi Linux/Unix per fare ciò si ricorre al comando “ls”, che una volta eseguito mostra il contenuto delle cartelle richieste. Se si aggiunge il parametro “-l”, i singoli file vengono indicati in un elenco chiaro:

ls -l

Un possibile risultato per questo comando, scelto in questo caso a titolo esem­pli­fi­ca­ti­vo, potrebbe pre­sen­tar­si così:

3 in totale
-rwx------  1 det det    0 2020-02-02 10:41 File1.txt
-rw-rw-r--  1 det det    0 2020-02-02 10:41 File2.txt
drwxr-xr-x  2 det det 4096 2020-02-02 10:44 Directory

Nel percorso eseguito si trovano quindi 2 file (“File1.txt” e “File2.txt”) e una directory (“Directory”). Ogni singola voce comincia con un blocco di caratteri a dieci cifre, in questo caso di par­ti­co­la­re interesse, visto che dà in­for­ma­zio­ni sui permessi di accesso per i file o la directory.

Il carattere al primo posto indica di cosa si tratta esat­ta­men­te. Nel caso di un file semplice si trova il segno meno come per le prime due righe. Una “d” (per directory) con­tras­se­gna le directory, mentre per i link ci sarebbe una “l” (dal­l'i­ni­zia­le della parola).

Seguono i tre blocchi decisivi con tre caratteri ciascuno, che informano sui permessi di accesso correnti. In questo caso si utilizza la già co­no­sciu­ta sequenza della notazione ottale: il blocco 1 sta per il pro­prie­ta­rio, il blocco 2 per la classe utente “gruppo”, il blocco 3 per tutti gli altri utenti. Anche all’interno dei singoli blocchi la sequenza è sempre la stessa:

  • la prima posizione indica se è stato dato il permesso di lettura (r),
  • la posizione 2 dà in­for­ma­zio­ni sul permesso di scrittura (w)
  • e con il terzo carattere di un blocco da tre si vede se la ri­spet­ti­va classe utente dispone anche dei permessi di ese­cu­zio­ne (x).

Una volta fissata la lettera, vengono dati i ri­spet­ti­vi permessi. Al­tri­men­ti nella ri­spet­ti­va posizione si trova il segno meno. Per entrambi i file e la directory risulta quindi questo:

File1.txt

  Pro­prie­ta­rio Gruppo Altri utenti
Lettura x x
Scrittura x x
Ese­cu­zio­ne x x

File2.txt

  Pro­prie­ta­rio Gruppo Altri utenti
Lettura
Scrittura x
Ese­cu­zio­ne x x x

Directory

  Pro­prie­ta­rio Gruppo Altri utenti
Lettura
Scrittura x x
Ese­cu­zio­ne

Esempio di come ag­giun­ge­re nuovi permessi con chmod

Nel primo esempio di utilizzo di chmod do­vreb­be­ro ora essere attivati i permessi di scrittura ed ese­cu­zio­ne per il File1.txt per tutte le classi di utenti finora riservati al pro­prie­ta­rio. Il cor­ri­spon­den­te comando chmod (notazione simbolica) si presenta così:

chmod a+rx File1.txt

Tutte le classi di utenti (a) ottengono quindi per il documento File1.txt nuovi permessi (+) e cioè il permesso di leggere (r) ed eseguire (x) questo file.

Suc­ces­si­va­men­te, dando un'oc­chia­ta al­l'e­len­co dei permessi assegnati, la riga del File1.txt appare ora così:

-rwxr-xr-x  1 det det    0 2020-02-02 10:41 File1.txt

Esempio di come revocare i permessi con chmod

Nel secondo esempio, tramite il comando chmod deve essere revocato il permesso di scrittura per il File2.txt a tutti gli utenti, quindi anche per il pro­prie­ta­rio e la classe utente "gruppo". Il comando cor­ri­spon­den­te (di nuovo secondo l'an­no­ta­zio­ne simbolica) si presenta nel modo seguente:

chmod a-w File2.txt

Anche in questo esempio con chmod il comando si riferisce a tutte le classi di utente (a). Il permesso di scrittura (w) per il File2.txt viene revocato (-) a tutti gli utenti. Il nuovo in­se­ri­men­to per il file si presenta quindi così:

-r--r--r--  1 det det    0 2020-02-02 10:41 File2.txt
Vai al menu prin­ci­pa­le