I permessi sono la prima cosa che si mette di traverso a chi arriva da Windows, e sono la materia più “da digitare” del 101: all’esame può capitare di dover scrivere l’ottale esatto, senza opzioni fra cui scegliere.

Leggere i permessi prima di cambiarli

$ ls -l
drwxrwxr-x 2 carol carol 4096 Dec 10 15:57 Another_Directory
-rw-rw-r-- 1 carol carol 1881 Dec 10 15:57 text.txt

Il primo carattere è il tipo: - file normale, d directory, l link simbolico, b e c device a blocchi e a caratteri, s socket. Seguono tre terne rwx: proprietario (u), gruppo proprietario (g), tutti gli altri (o). Terza e quarta colonna sono l’utente e il gruppo che possiedono il file.

Su una directory ls -l nomedir/ mostra il contenuto: per vedere lei serve ls -ld nomedir/, e -a aggiunge i file nascosti, quelli il cui nome inizia con un punto.

Sulle directory le lettere significano altro: r elenca i nomi, w crea e cancella voci, x attraversa. w senza x è inutile, e con il solo x puoi aprire un file di cui conosci già il nome esatto ma non listare la directory.

Due trappole ricorrenti. Si applica una sola terna, la prima che corrisponde: un file ----rwxrwx di tua proprietà è illeggibile per te, anche se il tuo gruppo può tutto. E cancellare un file non dipende dal w sul file, ma dai permessi w e x sulla directory che lo contiene.

chmod: ottale e simbolico

r vale 4, w vale 2, x vale 1; si sommano dentro ogni terna, nell’ordine utente, gruppo, altri. Quindi rw-r----- è 640 e rwxr-xr-x è 755. Se una cifra è dispari, quel livello ha il bit di esecuzione.

$ chmod 640 report.txt          # imposta esattamente rw-r-----
$ chmod u=rw,g=r,o= report.txt  # stessa cosa in modo simbolico
$ chmod g+w,o-rwx report.txt    # tocca solo i bit che nomini

L’ottale conviene quando sai già il risultato che vuoi, il simbolico quando devi accendere o spegnere un singolo bit senza toccare il resto: + aggiunge, - toglie, = fissa il valore esatto, e a vale per tutti e tre i livelli insieme.

Con -R si scende ricorsivamente, ed è il modo più rapido per fare danni. Se ti serve, usa la X maiuscola: chmod -R u+rwX progetto/ mette x alle directory e ai file già eseguibili, e lascia in pace gli altri.

Proprietà: chown, chgrp e il campo gruppo

chown cambia utente e gruppo, chgrp solo il gruppo. La sintassi con i due punti è da sapere a memoria.

$ chown carol:students relazione.txt   # utente e gruppo
$ chown carol relazione.txt            # solo utente
$ chown :students relazione.txt        # solo gruppo
$ chgrp students relazione.txt         # solo gruppo, altro comando

Solo root può regalare un file a un altro utente: chi ci prova da utente normale riceve Operation not permitted.

Il campo gruppo è lo strumento standard per far collaborare più persone sugli stessi file: assegni il gruppo giusto e dai rwx al gruppo. Per orientarti, getent group elenca i gruppi, groups carol dice a quali appartiene carol, id carol mostra UID, GID e gruppi secondari.

umask: perché un file nasce 644 e una directory 755

I file partono da una base 666 e le directory da 777, perché ai file non viene mai dato x d’ufficio; la umask spegne dei bit su quella base.

$ umask
0022
$ umask -S
u=rwx,g=rx,o=rx

Con 022 un file nasce 644 e una directory 755; con 027 il file nasce 640 e la directory 750. Qui cascano in molti: la umask non si sottrae, spegne bit. Con 022 la sottrazione dà per caso il risultato giusto, con 027 no — 666 meno 027 farebbe 637, mentre la risposta vera è 640.

Con un argomento umask cambia il valore solo per la shell corrente e per i processi che lancia. Il default arriva dal profilo di sistema: su Debian e Ubuntu è tipicamente 022 per tutti, mentre sulle distribuzioni Red Hat /etc/profile imposta 002 agli utenti con gruppo privato omonimo e 022 a root.

I tre bit speciali

Ci sono altri tre bit, che in ottale occupano una quarta cifra davanti alle altre.

SUID (4, u+s) vale solo sui file eseguibili: il programma gira con l’identità del proprietario del file, non di chi lo lancia. È il motivo per cui passwd, di proprietà di root, riesce a scrivere in /etc/shadow. Si vede come s al posto della x dell’utente, in -rwsr-xr-x.

SGID (2, g+s) sui file fa girare il processo con il gruppo del file; sulle directory è più utile, perché ogni file creato dentro eredita il gruppo della directory invece del gruppo primario di chi lo crea. È la mossa standard per una cartella condivisa: drwxr-sr-x.

Sticky bit (1, o+t) vale solo sulle directory: un file può essere cancellato o rinominato solo dal suo proprietario, dal proprietario della directory o da root, anche se la directory è scrivibile da tutti. È il caso di /tmp, che infatti è drwxrwxrwt.

$ chmod 4755 programma      # SUID
$ chmod 2775 condivisa/     # SGID su directory
$ chmod 1777 /tmp           # sticky bit
$ chmod 0755 programma      # azzera i bit speciali

Una S o una T maiuscola significa bit speciale acceso ma x mancante, quindi inerte; la minuscola significa bit acceso e x presente.