Cos’è chmod?
Il programma della riga di comando “chmod”, abbreviazione di “Change Mode”, è stato introdotto all’inizio degli anni 70 con la prima versione del sistema Unix di AT&T. Nei sistemi operativi Unix multiutente è utilizzato per assegnare i permessi di accesso nei file system che supportano i classici permessi dei file di Unix. Ciò vale generalmente per tutti i file di sistema standard sui derivati comuni di Linux, impiegati per il funzionamento del server. Per le modifiche che devono essere apportate agli attributi di un file tramite chmod è necessario essere il proprietario di questo file o disporre di permessi di root.
Sulla maggior parte dei server web sono installate distribuzioni 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, modificabili su Linux attraverso “chmod”, un programma della riga di comando che si attiva dal terminale tramite l’immissione del comando omonimo.
Sulla maggior parte dei server web sono installate distribuzioni 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, modificabili su Linux attraverso “chmod”, un programma della riga di comando che si attiva dal terminale tramite l’immissione del comando omonimo.
Come funziona il comando chmod?
Essenzialmente 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, attraverso lettere, e l’assegnazione 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 proprietario del file o dall’utente root. La sintassi corrispondente da immettere nella riga di comando è sempre la seguente:
$ chmod options mode file
Al comando chmod segue l’elemento facoltativo “options”, con il quale si possono stabilire altre opzioni del comando chmod. L’elemento “mode” corrisponde alla maschera dei permessi da applicare al successivo “file”, cioè al file o alla cartella. Questa maschera fornisce informazioni sull’assegnazione 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’impostazione dei permessi di accesso avviene sempre basandosi su tre classi di utenti:
Per l’impostazione dei permessi, come appena spiegato, sono disponibili due modalità: l'annotazione simbolica e l'annotazione ottale, le cui basi verranno riassunte in breve nei prossimi paragrafi.
Proprietario (user) | In genere un utente che crea un file nel file system di Unix viene definito automaticamente come “utente” del file. La proprietà può essere cambiata successivamente 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 automaticamente a un gruppo principale; anche un’appartenenza ad altri gruppi è possibile. L’assegnazione dei file a un gruppo può essere configurata sia dal proprietario che dall’utente root tramite il comando “chgrp”. |
Altri (others) | La classe utente “altri” comprende tutti gli utenti, che non sono né proprietari del file né componenti di un gruppo con i relativi permessi di accesso. |
Modalità simbolica
Nella modalità simbolica si assegnano lettere alle diverse classi degli utenti e ai permessi di accesso. Grazie a una combinazione di queste lettere si può tranquillamente indicare quali permessi devono essere aggiunti o rimossi. La tabella seguente riepiloga le lettere distintive per gli utenti e i permessi nell’ambito della notazione simbolica:
Una volta che la maschera dei permessi è stata creata in base alla notazione simbolica, entrano in campo i seguenti operatori che collegano le rispettive classi di utenti con i permessi dei file:
Se ad esempio il file “esempio.txt”, introdotto sopra, deve essere modificato per fare in modo che non solo il proprietario (user), ma anche tutti gli altri utenti (group, other) ricevano i permessi di lettura e scrittura, il comando chmod da applicare sarebbe:
Lettera per permesso di accesso | Significato |
r | Permesso di lettura; chiamato anche R-bit |
w | Permesso di scrittura; chiamato anche W-bit |
x | Permesso di esecuzione (execute); chiamato anche X-bit |
Lettera per classe utente | Significato |
u | Classe utente “user”, proprietario |
g | Classe utente “group”, gruppo |
o | Classe utente “others”, altri utenti |
a | “all”; il comando si riferisce a tutte le classi degli utenti |
+ | Con l’operatore “+” vengono assegnati alla classe utente dei nuovi permessi per i file. Solo i permessi dei file coinvolti vengono sovrascritti. |
- | L’operatore “-” revoca il permesso del file a una classe utente. |
= | L’operatore “=” è utilizzato se i permessi dei file per una classe utente devono essere stabiliti nuovamente, indipendentemente da quelli precedenti. |
$ chmod ugo+rw esempio.txt
In alternativa è possibile riferirsi a tutte le classi di utenti:
$ chmod a+rw esempio.txt
Il file “esempio.txt”, richiamato dal terminale, mostrerebbe 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 aggiungere r = read w = write | user: read, write group: read, write other: read, write |
Modalità ottale
La notazione simbolica è chiara, ma risulta disagevole utilizzandola spesso. Per questo motivo per l’assegnazione dei permessi di accesso molti amministratori ricorrono alla notazione ottale. In questo caso si tratta di una sequenza a tre cifre, in cui ogni posizione rappresenta una classe utente del server. L’annotazione ottale si orienta perciò alla sequenza standard:
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 corrispondenti:
Da questa assegnazione risultano le seguenti combinazioni di valori per i permessi di accesso:
L’annotazione ottale si può spiegare meglio con un esempio. Partendo dal presupposto che il proprietario del file di esempio “esempio.txt” abbia intenzione di concedere anche al gruppo “gruppoesempio” i permessi di lettura, si utilizzerebbe il seguente codice ottale:
Posizione della cifra della classe utente | Significato |
1 | Corrisponde alla classe utente “proprietario“ (user) |
2 | Corrisponde alla classe utente “gruppo“ (group) |
3 | Corrisponde alla classe utente “altri” (others) |
Valore per permesso di accesso | Significato |
4 | Lettura |
2 | Scrittura |
1 | Esecuzione |
0 | Nessun permesso |
Valore | Permesso/i di accesso |
0 | Nessuno |
1 | Solo esecuzione |
2 | Solo scrittura |
3 | Scrittura/esecuzione |
4 | Solo lettura |
5 | Lettura/esecuzione |
6 | Lettura/scrittura |
$ chmod 640 esempio.txt
Con il valore 6 al primo posto della maschera dei permessi il proprietario 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 codificato dal valore 0.
Opzioni del comando chmod
Sia che un utente decida di utilizzare l’annotazione simbolica o quella numerica, ha a disposizione diverse opzioni per l’assegnazione dei permessi, che vengono inserite nella riga di comando tra il comando e la maschera dei permessi.
L’esempio seguente mostra un comando per rendere ricorsiva la modifica dei permessi delle sottocartelle e dei file all’interno della cartella:
Codice | Opzione | Descrizione |
-R | recursive | La modifica dei permessi riguarda tutti i file e le sottocartelle all’interno di una cartella. |
-v | verbose | Dopo aver dato questo comando viene comunicata la diagnosi per tutti i file elaborati. |
-c | changes | Dopo aver dato questo comando viene comunicata la diagnosi per tutti i file che sono stati modificati. |
-f | silent | I messaggi di errore vengono soppressi. |
$ chmod -R 744 cartellaesempio
Per tutti i file e le sottocartelle nella directory “cartellaesempio” vale che il proprietario 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 cominciare con un controllo generale dei permessi assegnati attualmente. 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:
Prima di tutto, però, si dovrebbe cominciare con un controllo generale dei permessi assegnati attualmente. 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 esemplificativo, potrebbe presentarsi 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 particolare interesse, visto che dà informazioni sui permessi di accesso per i file o la directory.
Il carattere al primo posto indica di cosa si tratta esattamente. Nel caso di un file semplice si trova il segno meno come per le prime due righe. Una “d” (per directory) contrassegna le directory, mentre per i link ci sarebbe una “l” (dall'iniziale 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à conosciuta sequenza della notazione ottale: il blocco 1 sta per il proprietario, 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:
File1.txt
File2.txt
Directory
Il carattere al primo posto indica di cosa si tratta esattamente. Nel caso di un file semplice si trova il segno meno come per le prime due righe. Una “d” (per directory) contrassegna le directory, mentre per i link ci sarebbe una “l” (dall'iniziale 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à conosciuta sequenza della notazione ottale: il blocco 1 sta per il proprietario, 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à informazioni sul permesso di scrittura (w)
- e con il terzo carattere di un blocco da tre si vede se la rispettiva classe utente dispone anche dei permessi di esecuzione (x).
File1.txt
Proprietario | Gruppo | Altri utenti | |
Lettura | x | x | |
Scrittura | x | x | |
Esecuzione | x | x |
Proprietario | Gruppo | Altri utenti | |
Lettura | |||
Scrittura | x | ||
Esecuzione | x | x | x |
Proprietario | Gruppo | Altri utenti | |
Lettura | |||
Scrittura | x | x | |
Esecuzione |
Esempio di come aggiungere nuovi permessi con chmod
Nel primo esempio di utilizzo di chmod dovrebbero ora essere attivati i permessi di scrittura ed esecuzione per il File1.txt per tutte le classi di utenti finora riservati al proprietario. Il corrispondente 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.
Successivamente, dando un'occhiata all'elenco dei permessi assegnati, la riga del File1.txt appare ora così:
Successivamente, dando un'occhiata all'elenco 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 proprietario e la classe utente "gruppo". Il comando corrispondente (di nuovo secondo l'annotazione 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 inserimento per il file si presenta quindi così:
-r--r--r-- 1 det det 0 2020-02-02 10:41 File2.txt