Guida al Terminale (base)

Permessi su file e directory

I sistemi operativi unix, dai quali Linux discende, sono sempre stati costruiti come sistemi multiutente, ovvero permettendo lo svolgere di operazioni a moltipleci utenti nello stesso istante (contemporaneamente).
Questa caratteristica, nata quando esistava la differenza tra mainframe e terminali periferici, dai quali gli utenti eseguivano le loro operazioni, è andata perdendosi con l'avvento dei personal computer.
I pc moderni, posseggono ancora qualcosa di simile, seppur non tutti dispongono di una vera e propria contemporaneità d'uso, la maggior parte permette la suddivisione in più utenti, per separere i file personali di ciascuno.

Per questo motivo si ha la necessità di gestire alcune informazioni aggiuntive per ogni file e per ogni directory presente. Tali informazioni sono gestite dal sistema operativo in modo automatico e salvate nell'albero del filesystem.

Queste informazioni vengono chiamate, in gergo, attributi dei file e comprendono tutta una serie di cose tra cui i permessi,il tipo di file, e il proprietario sulle quali ci concetreremo in particolar modo.

Tipi di file

A differenza del nome, che potrebbe trarre in inganno, questi 4 bit non identificano cosa contiene il file (al sistema operativo a questo livello non interessa se il vostro file è un .mp3 dei Led Zeppelin oppure la foto di Dicembre del calendario Pirelli) ma distinguono a cosa serve il file, ovvero se questo è un regular file (normale file, ad esempio la foto di prima); se è una directory, se è un link simbolico oppure se è un file speciale. [ In realtà non esista una categoria file speciale ma altri quattro tipi, che non prendiamo in considerazione per troppa complessita degli argomenti trattati].

Come abbiamo introdotto nella prima lezione esiste un comando per visualizzare queste (ed altre) informazioni: ls -l

[manuel@falcon Musica ]$ ls -l
totale 445280
-rw-r--r--  1 manuel users 20512963 23 gen  2010 Pink_Floyd_-_In_the_Flesh_.mp3
-rw-r--r--  1 manuel users 12920994 23 gen  2010 Pink_Floyd_-_The_Thin_Ice.mp3
-rw-r--r--  1 manuel users 14587802 23 gen  2010 Pink_Floyd_-_Another_Brick_in_the_Wall,_Part_1.mp3
-rw-r--r--  1 manuel users 10263095 23 gen  2010 Pink_Floyd_-_The_Happiest_Days_of_Our_Lives.mp3
-rw-r--r--  1 manuel users 23668405 23 gen  2010 Pink_Floyd_-_Another_Brick_in_the_Wall,_Part_2.mp3
-rw-r-----  1 manuel users 31558069 23 gen  2010 Pink_Floyd_-_Mother.mp3
-rw-r--r--  1 manuel users 27213271 23 gen  2010 Pink_Floyd_-_Hey_You.mp3
-rw-r--r--  1 manuel users 10197839 23 gen  2010 Pink_Floyd_-_The_Show_Must_Go_On.mp3
lrwxrwxrwx  1 manuel users        8 15 dic 22.34 U2 -> /home/manuel/Musica/Rock/U2
drwxr-xr-x  3 manuel users     4096 23 gen  2010 Dream_Theater
drwxr-xr-x  3 manuel users     4096 15 mar  2010 Genesis
drwxr-xr-x  3 manuel users     4096  6 ago  2009 Gordian_Knot
drwxr-xr-- 25 manuel users     4096 22 gen  2009 Iron Maiden
drwxr-xr-x  5 manuel users     4096 15 feb  2010 Pink_Floyd
drwxr-xr-x 20 manuel users     4096 28 ago  2008 Rush
drwxr-xr-x  9 manuel users     4096 19 apr  2009 Symphony X
drwxr-xr--  8 manuel users     4096 10 mag  2008 Threshold
drwxr-xr-x 15 manuel users     4096  4 feb  2010 Yes

Analizziamo la prima colonna: riporta svariate informazioni utili: -rw-r----- il primo carattere è quello che indica il tipo di file; infatti per Pink_Floyd_-_Mother.mp3 è indicato un trattino il che indica che è un regular file; viceversa possiamo osservare che drwxr-xr-x riguardo l'ultima riga ci indica una d quindi Yes sarà una directory; e ultimo ma non ultimo vediamo che a metà abbiamo una riga con valore lrwxrwxrwx che indica un link simbolico di nome U2 collegato alla directory U2 situata in un'altra porzione di filesystem: /home/manuel/Musica/Rock
Sappiamo benissimo cos'è un file regolare, ancor meglio cos'è una directory, potrebbe sorgerci la domanda su cos'è un link simbolico. Vengono chiamati in questo modo dei collegamenti che possono essere effettuati per riferirsi a file posizionati in altri punti dell'albero del filesystem. In pratica è come se potessimo spostarci in modo orizzontale, quando in realtà l'albero del filesystem può essere visitato solo dalla radice (in alto) alle foglie (in basso). Vediamo una foto di esempio:

Un collegamento simbolico

La directory U2 è all'interno di ~/Musica/Rock/ ma è accessibile direttamente dal path ~/Musica/U2 grazia al link simbolico abbiamo un oggetto che non è realmente una directory ma punta un differente path del filesystem.
I link simbolici possono essere fatti sia per collegarsi a directory, sia per collegarsi a dei file. Ad esempio, se avessimo ~/Musica/U2/Vertigo.mp3 e volessimo accedere al file semplicemente dalla nostra home directory (il cui path ricordiamo è /home/nomeutente/ o abbreviato ~/ ) potremmo creare un link simbolico a Vertigo.mp3 ovviamente chiamandolo come desideriamo. Il comando per fare ciò è ln dall'inglese link.

[manuel@falcon ~ ]$ ln -s ~/Musica/U2/Vertigo.mp3 ~/link_a_vertigo
Come si può notare vi sono due cose molto importanti. La prima è l'opzione -s, indispensabile per creare un link simbolico. La seconda è l'ordine dei parametri del comando, il target, ovvero il file (o directory) a cui dobbiamo puntare e successivamente il nome del collegamento, completamente a nostra scelta.

Permessi

Se osserviamo meglio -rwx------ notiamo che oltre al primo carattere vi sono altri tre gruppi di tre caratteri. Questi identificano i permessi.
La r indica Read access, ovvero permesso di lettura, la w indica Write access o permesso di scrittura, la x indica eXecute ovvero permesso di eseguire il file come programma, utile ad esempio se il nostro file fosse un file eseguibile come ad esempio un programma scritto da noi oppure uno script di shell, cioè quei file di testo con all'interno una sequenza di comandi per la shell.
Il primo gruppo di tre rappresenta i permessi per l'utente che possiede il file, nell'esempio di prima ls ci dice che tutti i file sono dell'utente manuel che fa parte del gruppo users. Il secondo gruppo di tre indica i permessi per il gruppo (users) ed il terzo insieme di tre indica i permessi per tutti gli altri (others),ovver quegli utenti che non fanno parte del gruppo specificato.
Nei sistemi operativi Unix ogni file è posseduto (owned) da un utente e un gruppo, dove con gruppo si intende un insieme di utenti. Attenzione però, non è detto che nel gruppo vi sia compreso anche l'utente specificato. Nell'esempio di prima l'utente manuel non è detto che faccia parte del gruppo users!!! Questa possibilità, che forse è un po complessa da capire, ci permette una flessibilità elevata, ad esempio potremmo dare permessi all'utente pippo facendolo diventare parte del gruppo users.
Così come potremmo impedire a tutti gli utenti che non si chiamano manuel e non facciano parte del gruppo users di leggere la nostra musica, ad esempio impostando i permessi a --- per others.
I tre gruppi di tre lettere spesso vengono identificati come numeri poichè vengono memorizzati nel filesystem come bit ( con il nome di mode bits, indicano cioè il modo di accesso al file.

Modificare i permessi

Per modificare i permessi esiste un comando apposta, chiamato chmod la cui descrizione di manuale è "change file mode bits". Permette infatti di cambiare bit dei permessi, vediamo come.
Il comando chmod accetta come input un insieme di permessi, ed uno o più file. L'insieme di permessi può essere specificato con un formato letterale un po strano.
Tale formato prevede una lettera per specificare se stiamo lavorando sui permessi utente ( u ), gruppo ( g ), altri ( o ) oppure tutti ( a ):
Un simbolo di meno ( - ) se vogliamo togliere i permessi o di ( + ) se vogliamo aggiungerli, ed infine il tipo di bit che vogliamo modificare, ovvero ( r ) per read, ( w ) per write oppure ( x ) per execute. (Ovviamente senza parantesi)
Esempio:

[manuel@falcon Musica ]$ chmod o+r Pink_Floyd_-_Mother.mp3

Il comando sopra aggiunge il bit di read ad others, ovvero permette a tutti gli utenti che non si chiamano manuel e non sono parte del gruppo users, di leggere (in questo caso ascoltare) il file. Gli altri utenti ne saranno felici.
In questo modo è possibile assegnare i permessi che ci interessano ai file che vogliamo.

Permessi e directory

Quando lavoriamo sulle directory, alcuni mode bits hanno un significato diverso. Ad esempio il bit di eXecute (+x) non rende eseguibile una directory (anche perchè non avrebbe alcun senso) perciò cambia significato, diventando un bit di attraversamento, tramite il quale è possibile specificare quali utenti possono ottenere l'elenco dei file al suo interno ed eventualmente se possono entrarvi (ovvero cambiare la directory corrente con il comando cd )
Vediamo un esempio, la directory segreta:

[manuel@falcon ~ ]$ cd segreta
bash: cd: segreta: Permesso negato

Ok, come si può vedere la directory esiste, ma non possiamo entrarci, quindi secondo voi quali permessi avra se io sono l'utente manuel del gruppo users?

[manuel@falcon ~ ]$ ls -la ./ | grep segreta
dr--r--r--   2 manuel users     4096 14 mag 15.28 segreta

Avete indovinato? È leggibile da chiunque, ma non è attraversabile (bit -x non è impostato) quindi non possiamo entrarvi. Anzi vi dirò di più, non è possibile nemmeno ottenere la lista dei file che vi sono all'interno! Proviamo a dare il comando ls:

[manuel@falcon ~ ]$ ls -la segreta/
ls: impossibile accedere a segreta/contocorrente.txt: Permesso negato
ls: impossibile accedere a segreta/repni.txt: Permesso negato
ls: impossibile accedere a segreta/articolo.txt: Permesso negato
ls: impossibile accedere a segreta/password.txt: Permesso negato
totale 0
-????????? ? ? ? ?            ? articolo.txt
-????????? ? ? ? ?            ? contocorrente.txt
-????????? ? ? ? ?            ? password.txt
-????????? ? ? ? ?            ? repni.txt

Ovviamente il comando ls non potrà darci le informazioni riguardo i file in esso contenuti, infattì veranno visualizzati soltanto i nomi.
Se non avessimo avuto i permessi di lettura il comando ls ci avrebbe risposto Permesso Negato perchè non avrebbe nemmeno potuto leggerne il contenuto.
Proviamo ora a cambiare i permessi della directory segreta in modo da poterci entrare e poter leggere i file ma non cancellarli, idee?
È semplice, dobbiamo impostare i bit di esecuzione (attraversamento) e di lettura, ma non quello di scrittura:

[manuel@falcon ~ ]$ chmod u+xr segreta
[manuel@falcon ~ ]$ ls -la segreta/
totale 16
dr-x------   2 manuel users  4096 14 mag 15.38 .
drwxr-xr-x 100 manuel users 12288 14 mag 15.31 ..
-rw-r-----   1 manuel users     0 14 mag 15.38 articolo.txt
-rw-r-----   1 manuel users     0 14 mag 15.37 contocorrente.txt
-rw-r-----   1 manuel users     0 14 mag 15.37 password.txt
-rw-r-----   1 manuel users     0 14 mag 15.38 repni.txt
[manuel@falcon ~ ]$ rm segreta/articolo.txt 
rm: impossibile rimuovere "segreta/articolo.txt": Permesso negato

Come si può notare, con il primo comando abbiamo abilitato la lettura e l'attraversamento per l'utente owner, in questo caso ls ci conferma essere il nostro utente (manuel). Abbiamo avuto la conferma usando il comando ls che siamo autorizzati a leggere ed entrare nella directory, poichè abbiamo ottenuto informazioni su tutti i file in essa contenuti. Tuttavia con il terzo comando, abbiamo cercato di eliminare il file articolo.txt ma poichè non abbiamo i permessi di scrittura su quella directory ci è stato detto Permesso Negato. Attenzione: non possiamo impedire l'eleminazione di singoli file, nemmeno se togliamo il bit di scrittura di un file, questo comportamento strano vale solo per le directory!
Facciamo un esempio:

[manuel@acer ~ ]$ ls segreta/
articolo.txt  contocorrente.txt  password.txt  repni.txt
[manuel@acer ~ ]$ chmod +w segreta/
[manuel@acer ~ ]$ chmod -w segreta/articolo.txt 

In questo modo abbiamo aggiunto la possibilità di modifica dei file all'interno della directory segreta, e rimosso l'autorizzazione alla scrittura del file articolo.txt

[manuel@acer ~ ]$ rm segreta/articolo.txt 
rm: rimuovere il file regolare vuoto protetto dalla scrittura "segreta/articolo.txt"? y
[manuel@acer ~ ]$ ls segreta/
contocorrente.txt  password.txt  repni.txt

Come vedete rm il comando per rimuovere un file ci ha avvertito che il file fosse in sola lettura, ma è stato sufficiente dirgli di si (y dall'inglese yes) per eliminare il file articolo.txt

Riassumendo

Abbiamo visto cos'è un link simbolico, e come crearlo per ottenere scorciatoie a directory "distanti", abbiamo giocato un po' con i mode bits per concedere o revocare permessi sui file ed infine abbiamo visto come modificare i permessi sulle directory, in modo da impedire l'accesso agli estranei ai nostri documenti.
Una nota importante: NON È SAGGIO SALVARE LE PROPRIE PASSWORD IN FILE DI TESTO SUL PROPRIO PC, anche con le restrizioni dei permessi salvare le proprie password significa in ogni caso poterle leggerle... quindi se qualcuno usasse il vostro computer in vostra assenza potrebbe leggere in ogni caso quei file, tutt'al più si ritroverà costretto a cambiare qualche permesso prima di poterlo fare. Inoltre come potete notare quei file di esempio sono file di dimensione zero (quinta colonna dell'esito del comando ls -la) :D Alla prossima!

  1. I primi passi
  2. Gestire i file
  3. Permessi su file e directory