Salta al contenuto principale

chmod e chown: permessi e proprietari dei file

Inviato da tuxsa il

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

La 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 simbolico

Le tre lettere possibili per ciascuna categoria sono:

LetteraSu un fileSu una directory
r (read)leggere il contenutoelencare i file contenuti
w (write)modificare il contenutocreare, rinominare ed eliminare file al suo interno
x (execute)eseguirlo come programma o scriptentrarci 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

  • chmod modifica i permessi (lettura, scrittura, esecuzione) di file e directory.
  • chown modifica 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.sh

Con 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.txt

Il 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.txt

Con = 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.

CifraPermessiSignificato
7rwx4+2+1: tutto
6rw-4+2: leggere e scrivere
5r-x4+1: leggere ed eseguire
4r--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 privata

I 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_privati

Esempio 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.txt

Il 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 principale

Il 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/html

Con -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.txt

Il 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 -R o un chown -R sulla 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 x se lo avvii come ./script.sh; con bash script.sh basta il permesso di lettura.
  • Senza x sulle directory non si entra, anche con r e w.
  • Il proprietario non può regalare i suoi file: un utente normale non può cedere un file a un altro con chown. Se ci prova ottiene Operazione non permessa. Può invece cambiare il gruppo, ma solo verso un gruppo di cui fa parte.
  • L'amministratore ignora i permessi: l'utente root può 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 chmod può non avere effetto.
  • I permessi predefiniti dei nuovi file dipendono dalla umask dell'utente (di solito risultano 644 per i file e 755 per le cartelle).

Riepilogo

ComandoCosa fa
chmod u+x fileIl proprietario può eseguire il file
chmod go-rwx fileToglie ogni permesso a gruppo e altri
chmod u=rw,go=r fileImposta esattamente i permessi
chmod 644 filePermessi rw-r--r--
chmod 755 filePermessi rwxr-xr-x
chmod 600 fileSolo il proprietario legge e scrive
chmod -R u=rwX,go=rX dirRicorsivo, x solo sulle directory
sudo chown utente fileCambia il proprietario
sudo chown utente:gruppo fileCambia proprietario e gruppo
sudo chown -R u:g dirCambia proprietario di un'intera cartella

Nel prossimo articolo: sudo, il comando per eseguire un'operazione con i privilegi di amministratore.