chmod cambia chi può fare cosa con un file o una cartella, mentre chown cambia a chi appartiene. Insieme gestiscono il sistema di permessi di Linux, che è alla base della sicurezza del sistema e spiega molti dei messaggi Permesso negato in cui ci si imbatte all'inizio.
Cos'è
chmod è l'abbreviazione di change mode, "cambia modalità" (i permessi), e chown di change owner, "cambia proprietario". Entrambi fanno parte del pacchetto GNU coreutils e sono eseguibili (/usr/bin/chmod e /usr/bin/chown), presenti su qualsiasi distribuzione GNU/Linux.
Prima di cominciare: come leggere i permessi
Ogni file e directory ha un proprietario (un utente), un gruppo e dei permessi per tre categorie di persone. Li vedi con ls -l:
$ ls -l appunti.txt
-rw-r--r-- 1 enzo staff 812 ott 2 10:15 appunti.txtLa prima colonna si legge così:
- rw- r-- r--
│ │ │ └── altri (others): sola lettura
│ │ └─────── gruppo (group): sola lettura
│ └──────────── proprietario (user): lettura e scrittura
└─────────────── tipo: - file, d directory, l link simbolicoLe tre lettere possibili per ciascuna categoria sono:
| Lettera | Su un file | Su una directory |
|---|---|---|
r (read) | leggere il contenuto | elencare i file contenuti |
w (write) | modificare il contenuto | creare, rinominare ed eliminare file al suo interno |
x (execute) | eseguirlo come programma o script | entrarci e attraversarla (con cd) |
Nelle colonne successive troverai il proprietario (enzo) e il gruppo (staff). Con id e groups vedi a quali gruppi appartieni.
Cosa fanno
chmodmodifica i permessi (lettura, scrittura, esecuzione) di file e directory.chownmodifica il proprietario e/o il gruppo.
In caso di successo non stampano nulla. Per cambiare i permessi di un file devi esserne il proprietario (o essere amministratore); per cambiarne il proprietario serve di norma essere amministratore, cioè usare sudo.
Come si usano
$ chmod [opzioni] modo file...
$ chown [opzioni] utente[:gruppo] file...Esempio 1: rendere eseguibile uno script
$ ls -l backup.sh
-rw-r--r-- 1 enzo staff 214 ott 2 10:15 backup.sh
$ ./backup.sh
bash: ./backup.sh: Permesso negato
$ chmod u+x backup.sh
$ ls -l backup.sh
-rwxr--r-- 1 enzo staff 214 ott 2 10:15 backup.sh
$ ./backup.shCon la forma simbolica si scrive prima a chi (u proprietario, g gruppo, o altri, a tutti), poi l'operazione (+ aggiunge, - toglie, = imposta esattamente), poi i permessi.
Esempio 2: togliere permessi agli altri
$ chmod go-rwx privato.txt
$ ls -l privato.txt
-rw------- 1 enzo staff 120 ott 2 10:15 privato.txtIl comando toglie lettura, scrittura ed esecuzione a gruppo e altri: solo tu puoi accedere al file.
Esempio 3: impostare i permessi in modo esatto
$ chmod u=rw,go=r relazione.txtCon = imposti esattamente i permessi indicati: qui il proprietario può leggere e scrivere, gruppo e altri solo leggere. Più impostazioni si separano con la virgola, senza spazi.
Esempio 4: la forma numerica (ottale)
Ogni permesso ha un valore: r = 4, w = 2, x = 1. Si sommano per ogni categoria, e si scrivono tre cifre: proprietario, gruppo, altri.
| Cifra | Permessi | Significato |
|---|---|---|
| 7 | rwx | 4+2+1: tutto |
| 6 | rw- | 4+2: leggere e scrivere |
| 5 | r-x | 4+1: leggere ed eseguire |
| 4 | r-- | solo leggere |
| 0 | --- | nessun permesso |
I valori più comuni:
$ chmod 644 pagina.html # rw-r--r-- file normale, leggibile da tutti
$ chmod 755 script.sh # rwxr-xr-x script o cartella pubblica
$ chmod 600 chiave.pem # rw------- file privato
$ chmod 700 privata # rwx------ cartella privataI file con le chiavi private di SSH devono essere 600: se sono più aperti, ssh li rifiuta con un avviso.
Esempio 5: le directory e il permesso x
Per una directory il permesso x è quello che consente di entrarci. Senza x non puoi usare cd, né accedere ai file dentro, anche se hai r:
$ chmod 755 documenti_pubblici
$ chmod 700 documenti_privatiEsempio 6: applicare i permessi a un'intera cartella
L'opzione -R (recursive) agisce su tutto il contenuto. Attenzione però a chmod -R 755: renderebbe eseguibili anche tutti i file normali. Due soluzioni più precise:
$ chmod -R u=rwX,go=rX sito/
$ find sito/ -type d -exec chmod 755 {} +
$ find sito/ -type f -exec chmod 644 {} +La X maiuscola assegna il permesso di esecuzione solo alle directory (e ai file già eseguibili). La seconda coppia di comandi usa find per trattare le directory e i file separatamente.
Esempio 7: cambiare proprietario con chown
$ sudo chown mario appunti.txt
$ ls -l appunti.txt
-rw-r--r-- 1 mario staff 812 ott 2 10:15 appunti.txtIl nuovo proprietario è mario; il gruppo non è cambiato.
Esempio 8: cambiare proprietario e gruppo insieme
$ sudo chown mario:redazione appunti.txt # utente e gruppo
$ sudo chown :redazione appunti.txt # solo il gruppo
$ sudo chown mario: appunti.txt # utente e suo gruppo principaleIl formato è utente:gruppo. Se ometti l'utente, cambia solo il gruppo; per il solo gruppo esiste anche il comando chgrp redazione file.
Esempio 9: cambiare un'intera cartella
$ sudo chown -R www-data:www-data /var/www/htmlCon -R proprietario e gruppo vengono cambiati su tutta la cartella e su ciò che contiene. È un'operazione tipica quando si sistema la cartella di un sito, che dev'essere gestita dall'utente del server web.
Esempio 10: controllare il risultato
$ ls -l file.txt
$ stat -c "%a %U:%G %n" file.txt
644 enzo:staff file.txtIl comando stat con quel formato mostra i permessi in forma numerica, il proprietario e il gruppo.
Esempio 11: uso negli script
Rimettere in ordine i permessi della cartella di un sito:
#!/bin/bash
SITO="/var/www/html"
[ -d "$SITO" ] || { echo "Cartella non trovata"; exit 1; }
find "$SITO" -type d -exec chmod 755 {} +
find "$SITO" -type f -exec chmod 644 {} +
chown -R www-data:www-data "$SITO"
echo "Permessi sistemati"Lo script va eseguito con sudo, perché cambia il proprietario.
Opzioni utili
-R: applica la modifica anche al contenuto delle cartelle.-v: mostra ogni modifica effettuata;-c: solo quelle che cambiano davvero qualcosa.--reference=file: copia permessi (o proprietario) da un altro file.chown -h: agisce sul link simbolico stesso invece che sul file a cui punta.chmod g+s cartella: i nuovi file creati nella cartella ereditano il gruppo della cartella (utile per cartelle condivise).chmod +t cartella: "sticky bit", per cui in una cartella condivisa ciascuno può eliminare solo i propri file (come in/tmp).
Attenzione a
- Mai
chmod -R 777: dà a chiunque permesso di leggere, scrivere ed eseguire tutto. È una scorciatoia diffusa nei forum per far sparire un errore, ma apre falle di sicurezza e spesso nasconde il problema vero, che è quasi sempre il proprietario sbagliato. - Cartelle di sistema: un
chmod -Ro unchown -Rsulla radice/o sulla tua cartella personale, fatto per sbaglio, può rendere il sistema inutilizzabile. Controlla due volte il percorso, e non usare.*con-R, perché può raggiungere la cartella superiore. - Per uno script serve il permesso
xse lo avvii come./script.sh; conbash script.shbasta il permesso di lettura. - Senza
xsulle directory non si entra, anche conrew. - Il proprietario non può regalare i suoi file: un utente normale non può cedere un file a un altro con
chown. Se ci prova ottieneOperazione non permessa. Può invece cambiare il gruppo, ma solo verso un gruppo di cui fa parte. - L'amministratore ignora i permessi: l'utente
rootpuò leggere e scrivere quasi tutto. - File system non Linux: su dischi formattati FAT, exFAT o NTFS i permessi Unix non esistono o sono simulati, e
chmodpuò non avere effetto. - I permessi predefiniti dei nuovi file dipendono dalla
umaskdell'utente (di solito risultano644per i file e755per le cartelle).
Riepilogo
| Comando | Cosa fa |
|---|---|
chmod u+x file | Il proprietario può eseguire il file |
chmod go-rwx file | Toglie ogni permesso a gruppo e altri |
chmod u=rw,go=r file | Imposta esattamente i permessi |
chmod 644 file | Permessi rw-r--r-- |
chmod 755 file | Permessi rwxr-xr-x |
chmod 600 file | Solo il proprietario legge e scrive |
chmod -R u=rwX,go=rX dir | Ricorsivo, x solo sulle directory |
sudo chown utente file | Cambia il proprietario |
sudo chown utente:gruppo file | Cambia proprietario e gruppo |
sudo chown -R u:g dir | Cambia proprietario di un'intera cartella |
Nel prossimo articolo: sudo, il comando per eseguire un'operazione con i privilegi di amministratore.