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.