In Linux, l’accesso ai file è gestito attraverso i permessi dei file, gli attributi e la proprietà. Questo assicura che solo gli utenti e i processi autorizzati possano accedere a file e directory.
Questo tutorial copre come usare il comando chmod
per cambiare i permessi di accesso a file e directory.
Permessi dei file in Linux #
Prima di andare avanti, spieghiamo il modello base dei permessi di Linux.
In Linux, ogni file è associato con un proprietario e un gruppo e assegnato con diritti di accesso ai permessi per tre diverse classi di utenti:
- Il proprietario del file.
- I membri del gruppo.
- Altri (tutti gli altri).
La proprietà del file può essere cambiata usando i comandi chown
e chgrp
.
Ci sono tre tipi di permessi di file che si applicano ad ogni classe:
- Il permesso di lettura.
- Il permesso di scrittura.
- Il permesso di esecuzione.
Questo concetto ti permette di specificare quali utenti sono autorizzati a leggere il file, scrivere sul file o eseguire il file.
I permessi dei file possono essere visualizzati usando il comando ls
:
ls -l filename.txt
-rw-r--r-- 12 linuxize users 12.0K Apr 8 20:51 filename.txt|- | | | | | | || | | | | | +-----------> 7. Group| | | | | +-------------------> 6. Owner| | | | +--------------------------> 5. Alternate Access Method| | | +----------------------------> 4. Others Permissions| | +-------------------------------> 3. Group Permissions| +----------------------------------> 2. Owner Permissions+------------------------------------> 1. File Type
Il primo carattere mostra il tipo di file. Può essere un file normale (-
), una directory (d
), un link simbolico (l
), o qualsiasi altro tipo speciale di file.
I nove caratteri successivi rappresentano i permessi del file, tre terzine di tre caratteri ciascuna. La prima terzina mostra i permessi del proprietario, la seconda i permessi del gruppo, e l’ultima terzina mostra i permessi di tutti gli altri. I permessi possono avere un significato diverso a seconda del tipo di file.
Nell’esempio sopra (rw-r--r--
) significa che il proprietario del file ha i permessi di lettura e scrittura (rw-
), il gruppo e gli altri hanno solo i permessi di lettura (r--
).
Ognuna delle tre triplette di permessi può essere costruita con i seguenti caratteri e ha effetti diversi, a seconda che siano impostati su un file o su una directory:
Effetto dei permessi sui file
Permesso | Carattere | Significato sul file |
---|---|---|
Lettura | - |
Il file non è leggibile. Non puoi visualizzare il contenuto del file. |
r |
Il file è leggibile. | |
Scrittura | - |
Il file non può essere cambiato o modificato. |
w |
Il file può essere cambiato o modificato. | |
Esegui | - |
Il file non può essere eseguito. |
x |
Il file può essere eseguito. | |
s |
Se si trova nella terzina user imposta il bit setuid . Se si trova nella tripletta group , imposta il bit setgid . Significa anche che il flag x è impostato.Quando i flag setuid o setgid sono impostati su un file eseguibile, il file viene eseguito con i privilegi del proprietario del file e/o del gruppo. |
|
S |
Come s ma il flag x non è impostato. Questo flag è raramente usato sui file. |
|
t |
Se trovato nella tripletta others imposta il bit sticky .Significa anche che il flag x è impostato. Questo flag è inutile sui file. |
|
T |
Come t ma il flag x non è impostato. Questo flag è inutile sui file. |
Effetto dei permessi sulle directory (cartelle)
In Linux, le directory sono tipi speciali di file che contengono altri file e directory.
Permesso | Carattere | Significato su Directory |
---|---|---|
Lettura | - |
Il contenuto della directory non può essere mostrato. |
r |
Il contenuto della directory può essere mostrato.) | |
Scrivi | - |
Il contenuto della directory non può essere alterato. |
w |
Il contenuto della directory può essere alterato. (per esempio puoi creare nuovi file, cancellare file ..etc.) |
|
Esegui | - |
La directory non può essere modificata. |
x |
La directory può essere navigata usando cd . |
|
s |
Se si trova nella terzina user , imposta il bit setuid . Se si trova nella tripletta group imposta il bit setgid . Significa anche che il flag x è impostato. Quando il flag setgid è impostato su una directory i nuovi file creati al suo interno ereditano l’ID del gruppo della directory (GID), invece dell’ID del gruppo primario dell’utente che ha creato il file.setuid non ha effetto sulle directory. |
|
S |
Come s ma il flag x non è impostato. Questo flag è inutile sulle directory. |
|
t |
Se si trova nella terzina others imposta il bit sticky .Significa anche che il flag x è impostato. Quando il bit appiccicoso è impostato su una directory, solo il proprietario del file, il proprietario della directory o l’utente amministrativo può cancellare o rinominare i file all’interno della directory. |
|
T |
Come t ma il flag x non è impostato. Questo flag è inutile sulle directory. |
Usare chmod #
Il comando chmod
ha la seguente forma generale:
chmod MODE FILE...
Il comando chmod
vi permette di cambiare i permessi su un file usando sia una modalità simbolica o numerica che un file di riferimento. Spiegheremo le modalità in dettaglio più avanti in questo articolo. Il comando può accettare uno o più file e/o directory separati da uno spazio come argomenti.
Solo root, il proprietario del file o l’utente con privilegi sudo possono cambiare i permessi di un file. Fate molta attenzione quando usate chmod
, specialmente quando cambiate ricorsivamente i permessi.
Metodo simbolico (testo) #
La sintassi del comando chmod
quando usate il modo simbolico ha il seguente formato:
chmod perms… FILE...
La prima serie di flags (), users flags, definisce quali classi di utenti i permessi al file sono cambiati.
-
u
– Il proprietario del file. -
g
– Gli utenti che sono membri del gruppo. -
o
– Tutti gli altri utenti. -
a
– Tutti gli utenti, identici augo
.
Se il flag utenti è omesso, quello di default è a
e i permessi che sono impostati da umaskare non sono interessati.
Il secondo set di flag (), i flag di operazione, definisce se i permessi devono essere rimossi, aggiunti o impostati:
-
-
Rimuove i permessi specificati. -
+
Aggiunge i permessi specificati. -
=
Cambia i permessi attuali nei permessi specificati. Se non vengono specificati permessi dopo il simbolo=
, tutti i permessi della classe utente specificata vengono rimossi.
I permessi (perms...
) possono essere impostati esplicitamente usando zero o una o più delle seguenti lettere: r
, w
, x
, X
, s
e t
. Usate una singola lettera dall’insieme u
, g
, e o
quando copiate i permessi da una a un’altra classe di utenti.
Quando impostate i permessi per più di una classe di utenti (), usate delle virgole (senza spazi) per separare i modi simbolici.
Di seguito alcuni esempi di come usare il comando chmod
in modalità simbolica:
-
Dare ai membri del gruppo il permesso di leggere il file, ma non di scriverlo ed eseguirlo:
chmod g=r filename
-
Rimuovere il permesso di esecuzione per tutti gli utenti:
chmod a-x filename
-
Rimuovi il permesso di scrittura per gli altri utenti:
chmod -R o-w dirname
-
Rimuovi il permesso di lettura, scrittura ed esecuzione per tutti gli utenti tranne il proprietario del file:
chmod og-rwx filename
La stessa cosa può essere realizzata anche utilizzando la seguente forma:
chmod og= filename
-
Dare il permesso di lettura, scrittura ed esecuzione al proprietario del file, il permesso di lettura al gruppo del file e nessun permesso a tutti gli altri utenti:
chmod u=rwx,g=r,o= filename
-
Aggiungi i permessi del proprietario del file ai permessi che hanno i membri del gruppo del file:
chmod g+u filename
-
Aggiungi un bit adesivo a una data directory:
chmod o+t dirname
Metodo numerico #
La sintassi del comando chmod
quando si usa il metodo numerico ha il seguente formato:
chmod NUMBER FILE...
Quando si usa il modo numerico, è possibile impostare i permessi per tutte e tre le classi di utenti (proprietario, gruppo e tutti gli altri) allo stesso tempo.
Il NUMBER
può essere un numero di 3 o 4 cifre.
Quando viene usato un numero di 3 cifre, la prima cifra rappresenta i permessi del proprietario del file, la seconda il gruppo del file e l’ultima tutti gli altri utenti.
Ogni permesso di scrittura, lettura ed esecuzione ha il seguente valore numerico:
-
r
(lettura) = 4 -
w
(scrittura) = 2 -
x
(esecuzione) = 1 - nessun permesso = 0
Il numero dei permessi di una specifica classe di utenti è rappresentato dalla somma dei valori dei permessi per quel gruppo.
Per trovare i permessi del file in modo numerico basta calcolare i totali per tutte le classi di utenti. Per esempio, per dare i permessi di lettura, scrittura ed esecuzione al proprietario del file, i permessi di lettura ed esecuzione al gruppo del file e solo i permessi di lettura a tutti gli altri utenti dovrete fare quanto segue:
- Proprietario: rwx=4+2+1=7
- Gruppo: r-x=4+0+1=5
- Altri: r-x=4+0+0=4
Utilizzando il metodo precedente arriviamo al numero 754
, che rappresenta i permessi desiderati.
Per impostare i flag setuid
, setgid
e sticky bit
usiamo un numero di quattro cifre.
Quando il numero di 4 cifre è usato, la prima cifra ha il seguente significato:
- setuid=4
- setgid=2
- sticky=1
- no changes = 0
Le tre cifre successive hanno lo stesso significato di quando si usa un numero di 3 cifre.
Se la prima cifra è 0 può essere omessa, e il modo può essere rappresentato con 3 cifre. Il modo numerico 0755
è lo stesso di 755
.
Per calcolare il modo numerico si può anche usare un altro metodo (metodo binario), ma è un po’ più complicato. Sapere come calcolare il modo numerico usando 4, 2 e 1 è sufficiente per la maggior parte degli utenti.
Puoi controllare i permessi del file nella notazione numerica usando il comando stat
:
stat -c "%a" filename
644
Ecco alcuni esempi di come usare il comando chmod
in modalità numerica:
-
Dare al proprietario del file i permessi di lettura e scrittura e solo i permessi di lettura ai membri del gruppo e a tutti gli altri utenti:
chmod 644 dirname
-
Dare al proprietario del file i permessi di lettura, scrittura ed esecuzione, leggere ed eseguire ai membri del gruppo e nessun permesso a tutti gli altri utenti:
chmod 750 dirname
-
Dare i permessi di lettura, scrittura ed esecuzione, e un bit adesivo a una data directory:
chmod 1777 dirname
-
Impostare ricorsivamente i permessi di lettura, scrittura ed esecuzione al proprietario del file e nessun permesso per tutti gli altri utenti su una data directory:
chmod -R 700 dirname
Utilizzare un file di riferimento #
L’opzione --reference=ref_file
permette di impostare i permessi del file come quelli del file di riferimento specificato (ref_file
).
chmod --reference=REF_FILE FILE
Per esempio, il seguente comando assegnerà i permessi del file1
a file2
chmod --reference=file1 file2
Modificare ricorsivamente i permessi del file #
Per operare ricorsivamente su tutti i file e le directory sotto la directory data, usa l’opzione -R
(--recursive
):
chmod -R MODE DIRECTORY
Per esempio, per cambiare i permessi di tutti i file e le sottodirectory sotto la directory /var/www
in 755
si usa:
chmod -R 755 /var/www
Operare sui collegamenti simbolici #
I collegamenti simbolici hanno sempre i permessi 777
.
Di default, quando si cambiano i permessi di un symlink, chmod
cambierà i permessi sul file a cui punta il link.
chmod 755 symlink
C’è la possibilità che invece di cambiare la proprietà della destinazione, si ottenga un errore “cannot access ‘symlink’: Permission denied”.
L’errore si verifica perché per impostazione predefinita nella maggior parte delle distribuzioni Linux i collegamenti simbolici sono protetti e non è possibile operare sui file di destinazione. Questa opzione è specificata in /proc/sys/fs/protected_symlinks
. 1
significa abilitato e 0
disabilitato. Si raccomanda di non disabilitare la protezione symlink.
Cambiare i permessi dei file in blocco #
A volte ci sono situazioni in cui si ha bisogno di cambiare in blocco i permessi di file e directory.
Lo scenario più comune è quello di cambiare ricorsivamente i permessi del file del sito web a 644
e i permessi della directory a 755
.
Utilizzando il metodo numerico:
find /var/www/my_website -type d -exec chmod 755 {} \;
find /var/www/my_website -type f -exec chmod 644 {} \;
Utilizzando il metodo simbolico:
find /var/www/my_website -type d -exec chmod u=rwx,go=rx {} \;
find /var/www/my_website -type f -exec chmod u=rw,go=r {} \;
Il comando find
cercherà file e directory sotto /var/www/my_website
e passerà ogni file e directory trovati al comando chmod
per impostare i permessi.
Conclusione #
Il comando chmod
cambia i permessi del file. I permessi possono essere impostati usando la modalità simbolica o numerica.
Per saperne di più su chmod
visita la manpage di chmod.