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.

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:

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.

 

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.

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:

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

 

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:

+

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.

 

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:

$ 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:

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)

 

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:

Valore per permesso di accesso

Significato

4

Lettura

2

Scrittura

1

Esecuzione

0

Nessun permesso

 

Da questa assegnazione risultano le seguenti combinazioni di valori per i permessi di accesso:

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

 

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:

$ 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.

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.

 

L’esempio seguente mostra un comando per rendere ricorsiva la modifica dei permessi delle sottocartelle e dei file all’interno della cartella:

$ 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:

ls -l

Un possibile risultato per questo comando, scelto in questo caso a titoloesemplificativo, 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:

  • 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).

Una volta fissata la lettera, vengono dati i rispettivi permessi. Altrimenti nella rispettiva posizione si trova il segno meno. Per entrambi i file e la directory risulta quindi questo:

File1.txt

 

Proprietario

Gruppo

Altri utenti

Lettura

x

x

Scrittura

x

x

Esecuzione

x

x

File2.txt

 

Proprietario

Gruppo

Altri utenti

Lettura

Scrittura

x

Esecuzione

x

x

x

Directory

 

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ì:

-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

Abbiamo una proposta per te:
Web hosting a partire da 1 €/mese!

Dominio gratis
Certificato SSL Wildcard incluso
Assistenza clienti 24/7
A partire da 1 €/mese IVA escl. per un anno,
poi 8 €/ mese IVA escl.