|
Una cosa che lascia sorpresi chi è
abituato a utilizzare il DOS è il fatto che certe operazioni
sui file non si possono fare se non si hanno adeguati permessi. In
DOS non ci sono permessi (tranne l’attributo di READ ONLY),
e dunque si rimane stupiti quando, tentando varie operazioni sui
file, si ottiene un messaggio di permission denied.
Vediamo quindi come funziona il meccanismo dei permessi di Linux.
Innanzitutto abbiamo degli utenti, ognuno identificato dalla login.
Ma ci sono anche dei gruppi di utenti. Ogni file appartiene
sia ad un utente, che è il suo proprietario, che ad un
gruppo. Si possono impostare separatamente i permessi per il
proprietario, per il gruppo e per “tutti gli altri”.
Vediamo la flessibilità di questo meccanismo. Posso rendere un
file leggibile e scrivibile al legittimo proprietario, leggibile ma
non scrivibile a tutti gli utenti del mio gruppo di lavoro, e né
leggibile né scrivibile agli altri. Detto questo, possiamo
dire che ogni file ha 3 possibili operazioni che si possono attivare
o disattivare: leggerlo, scriverlo (e cancellarlo) ed eseguirlo.
Ognuno di questi permessi può essere impostato separatamente
per il proprietario, per il gruppo e per tutti gli altri. Nessun
vincolo comunque vale per root, il quale può fare tutto.
Il comando ls ha degli “switch”
che permettono di esaminare il particolare stato di un file allo
scopo di stabilire per quale motivo non si riesce a leggere un dato
file. A volte è meglio capire perché non si riesce a
fare una data operazione (e anche cercare di capire perché è
stata inibita, magari c’è un buon motivo) piuttosto che
diventare root per non avere “noiosi” vincoli (che di
solito sono vitali per la sicurezza del sistema).
Parlavamo degli switch. Gli
switch sono argomenti opzionali di un comando che permettono di
modificarne il comportamento. Tutti i comandi hanno degli switch. Se
ricordate il dir /p del DOS, il /p è appunto uno
switch. Solo che in Linux gli switch convenzionalmente non cominciano
con la barra ‘/’ (che serve nei path dei file) ma con il
trattino. Proviamo ad usare il comando ls con lo switch -l
che significa “long”, ovvero dettagliato:
$ ls -l
-rw-r--r-- 1 root root \
3299 Dec 29 10:25 article
-rwxr-xr-x 1 msciab msciab \
1766 Nov 28 16:05 pipesock
drwxr-x--- 5 msciab users\
1024 Dec 27 12:39 document
Cosa c’è in questa directory? Innanzitutto, un file,
article. Questo file è posseduto dall’utente root
e dal gruppo root (che sono due cose diverse anche se hanno lo
stesso nome di solito per ogni utente pippo si crea un
gruppo pippo che contiene innanzitutto l’utente pippo
stesso, ma al quale possono essere aggiunti altri utenti). Il file
article è di 3299 byte, è stato modificato
l’ultima volta il 19 dicembre, ed è leggibile e
scrivibile dal suo proprietario (root), e soltanto leggibile dal
gruppo root e dagli altri. Infatti consideriamo la stringa di dieci
caratteri che indica i permessi (la prima di ogni riga): -rw-r--r--:
il primo carattere è d se è una directory, è
- per i file normali (può anche essere l per i link, c
per i file speciali a carattere, b per i file speciali a
blocchi eccetera). I restanti 9 caratteri vanno spezzati in tre
gruppi di tre, che definiscono i permessi, in ordine, per
proprietario, gruppo e “mondo”; ogni gruppo dice in
ordine lettura (r), scrittura (w) e esecuzione (x).
Quindi: rw- per il proprietario, r-- per il gruppo e
tutti gli altri. Il secondo file invece, pipesock, è un
leggibile ed eseguibile da tutti, mentre è scrivibile solo dal
proprietario. Infine, document è una directory. Per le
directory il permesso x sta per il diritto di “entrarci”.
Notare che in Linux sono eseguibili
anche normali file di testo, non necessariamente dei binari. Di
solito si tratta di programmi simili ai batch del DOS, detti script.
In DOS, i file di testo eseguibili sono i .BAT, mentre i
binari eseguibili sono .EXE e .COM. Linux invece
distingue automaticamente i binari eseguibili perché i primi 4
byte di ogni file rappresentano un magic number che ne
specifica il tipo. Se un file non viene riconosciuto in altro modo,
lo si considera uno script di shell (la shell è l’equivalente
del COMMAND.COM DOS) e viene fatto eseguire da /bin/sh.
Linux ha anche un interessante
meccanismo che consente di specificare quale interprete deve
effettivamente eseguire uno script. Se infatti il file comincia con
#!, allora il resto della linea identifica l’interprete.
Uno script di shell spesso comincia con #!/bin/sh; se si
tratta di uno script che funziona solo con le estensioni della bash
(Bourne Again Shell, la shell dello GNU, standard di Linux), si
specifica #!/bin/bash; gli script Perl spesso cominciano con
#!/usr/bin/perl, ma il meccanismo funziona con i vari
linguaggi, come tcl, python e perfino i makefile.
Rimane da esaminare come si cambiano i
permessi e la proprietà dei file. Cominciamo dai permessi. il
comando è chmod <permessi> file.... Per
<permessi> si intende una stringa la cui sintassi è
(in parte) [ugoa][+-][rwx]. Ovvero user
(proprietario), group, other (altri) o
all (tutti); + aggiungi, - togli il permesso di
lettura/scrittura/esecuzione. Esempi:
chmod a+x file
[rendi il file eseguibile da tutti]
chmod og-rwx file
[togli i permessi al gruppo e gli altri]
Comunque il modo più comodo per impostare i permessi è
quello “complessivo” utilizzando un codice ottale.
Consideriamo una stringa rwxr-xr-x. Se trasformiamo in zeri i
trattini e in uni gli altri caratteri, otteniamo 111 101 101, che in
ottale è 755. Un comando chmod 755 file imposta
in un colpo solo i permessi del file. Può sembrare complicato,
ma in fondo i casi pratici sono pochi: 4 sola lettura (r--),
6 lettura e scrittura (rw-), 5 lettura e esecuzione (r-x)
e 7 tutto (rwx). Di solito i permessi dei file non sono
complicati. Nel 90% dei casi i file devono essere leggibili ed
eseguibili da tutti e scrivibili dal proprietario. Si può
impostare questo permesso con un solo comando ad un intero albero di
directory con:
chmod -R 755 directory
dove il -R applica
ricorsivamente il comando all’intero albero di directory.
Infine abbiamo un comando per cambiare
la proprietà di un file, chown che può essere
eseguito solo da root. Se vogliamo assicurarci che tutti i
file di directory appartengano al proprietario e gruppo root
ecco come fare:
chown -R root.root directory
Naturalmente lo switch -R non è
obbligatorio, e ha la stessa funzione dell’omonimo switch di
chmod; proprietario e gruppo vengono separati dal punto.
|