Diritti di accesso ai file in Unix:
l'uso
di umask
In
teoria...
Nella man page di Linux per umask(2) si legge:
umask sets the umask to mask & 0777.
The umask is used by open(2) to set initial file permissions on a newly-created file.Specifically, permissions
in the umask are turned off from the mode argument to open(2) (so, for example, the common umask default value of 022 results in new files being created with permissions 0666 & ~022 = 0644 = rw-r--r-- in the usual case where the mode is specified as 0666).
Il problema chiaramente
è quali permessi assegnare ad un nuovo file. open(2) e creat(2) permettono
di specificare i permessi di cui deve essere dotato un nuovo file al momento
della sua creazione, attraverso il loro parametro mode. Tuttavia, i permessi
effettivamente assegnati al nuovo file sono determinati come il risultato di:
mode & ~umask.
E' da notare che questa operazione non ha alcun effetto sulla possibilità di modificare successivamente tali permessi, ovvero questo sarà possibile o meno secondo le solite regole di accesso di UNIX.
...e
in pratica
Di seguito si fa qualche test per vedere se quanto detto nella man page è corretto. Si usa il seguente programma, che crea un nuovo file "new_file" usando la system call creat.
0. /* umask_test.c */
1. #include <sys/types.h>
2. #include <sys/stat.h>
3. #include <fcntl.h>
4.
5. int main(void)
6. {
7. int fd;
8.
9. umask(0);
10. fd = creat("new_file", 0666);
11.
12. return 0;
13. }
Test 1: Risultato dell'esecuzione
del programma di test:
[marco ~/src/prova]$ ./umask_test
[marco ~/src/prova]$ ls -l new_file
-rw-rw-rw- 1 marco marco 0 Oct 16 02:27 new_file
Il nuovo file viene creato
con i permessi 0666, ovvero:
0666 & ~0 =
0666 & 1111 =
0666
Test 2: E' possibile cambiare i file permission di un file anche se nel codice si invoca umask(0):
[marco ~/src/prova]$ ./umask_test
[marco ~/src/prova]$ ls -l new_file
-rw-rw-rw- 1 marco marco 0 Oct 16 02:18 new_file
[marco ~/src/prova]$ chmod a+x new_file
[marco ~/src/prova]$ ls -l new_file
-rwxrwxrwx 1 marco marco 0 Oct 16 02:18 new_file
Il primo comando crea il
file "new_file" con i permessi 0666 & ~0 (cioè 0666), come
mostrato nel test precedente . Provo a cambiare i permessi del file col terzo
comando (chmod) e il quarto comando dimostra che il cambiamento è stato
accettato.
Test 3: Eliminazione della
riga 9:
Se si elimina lo statement umask(0); dal programma di prova, la umask viene
ereditata dal processo padre, molto probabilmente la shell.
[marco ~/src/prova]$ umask
002
[marco ~/src/prova]$ ./umask_test
[marco ~/src/prova]$ ls -l new_file
-rw-rw-r-- 1 marco marco 0 Oct 16 02:22 new_file
Il primo comando dice che
la umask per la shell è 002. Questo valore verrà ereditato dai
processi figli. Il secondo comando crea il file new_file, questa volta con i
permessi dati da:
0666 & ~002 (cioè 0664)
e il terzo comando mostra che questi sono i permessi assegnati al file.
Reference
man page di umask(2), open(2) e creat(2), per l'uso della umask e i permessi dei nuovi file.
man page di bash(1), per avere informazioni sul comando built-in umask
man page di chattr(2), un
comando che permette di rendere un file non modificabile, nemmeno per l'owner
del file stesso.