dic 032012
 

In un sistema GNU/Linux ogni file o cartella ha delle autorizzazioni di accesso. Ci sono tre tipi di autorizzazioni (cosa è permesso fare con un file di qualsiasi tipo, incluse le directory):

(r) accesso in lettura
(w) accesso in scrittura
(e) accesso in esecuzione

Ci sono anche altre autorizzazioni ”speciali”, ma per questo articolo le autorizzazioni di base saranno sufficienti per illustrare come funziona umask, e le autorizzazioni sono definite per tre tipi di utenti:

il proprietario del file
il gruppo a cui il proprietario appartiene
Tutti gli altri utenti

umask (user mask) è un comando e una funzione in ambienti POSIX che imposta la modalità della maschera di creazione del file del processo in corso che limita le modalità di autorizzazione per i file e le directory create dal processo. Un processo può cambiare la modalità di creazione del file con la maschera umask e il nuovo valore viene ereditato dai processi figli.

In pratica con umask è possibile definire i permessi dei nuovi file che il processo creerà.


La maschera utente contiene i valori ottali delle autorizzazioni che si desidera impostare per tutti i nuovi file, per calcolare il valore di umask sottrarre il valore delle autorizzazioni che si desidera ottenere da 666 (per un file) o 777 (per una directory ).

Il resto è il valore da utilizzare con il comando umask.
Ad esempio, si supponga di voler modificare la modalità di default per i file a 664 (rw-rw-r -). La differenza tra 666 e 664 è 002, che è il valore che si deve usare come argomento per il comando umask .

O semplicemente usare questa comoda tabella:

umask Octal Value File Permissions Directory Permissions
0 rw- rwx
1 rw- rw-
2 r-- r-x
3 r-- r--
4 -w- -wx
5 -w- -w-
6 --x --x
7 --- (none) --- (none)

In questo articolo vi mostrerò in pratica come utilizzare umask per cambiare i permessi dei nuovi file: quindi aprite un terminale e seguitemi in questa piccola lista di comandi ed esempi

1) Verifica dei permessi base

Creiamo un file in /tmp

 cd /tmp
touch primofile
ls -l primofile

Probabilmente avrete un output come questo:

-rw-r--r-- 1 root root 0 Dec  3 23:34 primofile

Questo è un valore predefinito, come si può vedere, guardando da sinistra, l’utente che ha creato il file (root per me) è in grado di leggere e scrivere il file, il gruppo (root) può solo leggere ed anche tutti gli altri possono leggere il file , questa è la umask standard con un valore pari a 0022, per verificare la umask che si sta utilizzando in un terminale è possibile eseguire il comando umask senza parametri:

root@myserv:/tmp# umask
0022

2)Cambiare la umask predefinita

Così ora sappiamo che la umask predefinita è 0022 che produce file con permessi -rw-r–r–, ma in molti casi si vuole dare ai nostri colleghi il permesso di scrittura nella directory e file che creiamo, quindi per calcolare la nuova umask traduciamo le autorizzazioni -rw-rw-r– nella loro rappresentazione ottale, ovvero: 664 e sottraiamo questo numero da 666, il risultato è la umask che si desidera impostare nella shell:

umask 0002
cd /tmp
touch secondfile
ls -l secondfile

E questa volta otterrete questo output:

-rw-rw-r-- 1 root root 0 Dec  4 23:16 secondfile

3) Configurare umask per i processi

A volte si hanno processi e demoni che creano file e si desidera gestire i permessi di questi file, un tipico esempio che mi viene in mente è un server httpd apache che crea file con upload o con alcuni script ed una volta che sono stati creati che si desidera modificarli con il proprio utente che condivide lo stesso gruppo di apache, come fare?

In generale, si deve mettere il comando umask nello script che viene utilizzato per avviare il demone o in file inclusi alla partenza, quindi per apache potrebbe essere /etc/init.d/apache2 (debian) o molto meglio nel file di ambiente incluso, /etc/apache2/envvars (debian)

Quindi configurando l’umask nel file /etc/apache2/envvars :

...
# umask 002 per creare i file con permessi 0664 e cartelle con 0775
umask 002

E facendo ripartire apache:

/etc/init.d/apache2 restart

Ed ora se potete verificare con un nuovo file creato dovreste vedere qualcosa di simile a questo:

ls -l *.txt
-rw-rw-r-- 1 www-data www-data  14 2012-12-01 18:58 test2.txt
-rw-r--r-- 1 www-data www-data  14 2012-12-01 18:55 test.txt


4) Configurare la umask predefinita per tutto il sistema

Così ora sapete come cambiare l’umask in un terminale attivo o in una sessione, ma come cambiarla in modo permanente?
Per modificare l’umask solo per un utente il modo più semplice è quello di impostare il comando umask NEWUMASK nel file ~/.bashrc di quell’utente (supponendo che stia usando bash) o nel file equivalente che viene caricato all’inizio della sua sessione dalla sua shell.

Per modificare l’umask per tutti gli utenti è necessario modificare alcune impostazioni di sistema e questi dipende dalla vostra distribuzione Linux:

Debian 6

In Debian questo può essere gestito con l’aiuto di moduli PAM, pam_umask è un modulo PAM per impostare la modalità umask dei file creati nella sessione. La umask influenza le autorizzazioni predefinite assegnate ai file appena creati, per attivare/modificare queste autorizzazioni modificare i file:

/etc/pam.d/common-session
/etc/pam.d/common-session-noninteractive

Ed in ognuno di questi file aggiungere la riga:

session    optional     pam_umask.so umask=0002

In questo modo tutte le sessioni utilizzeranno la umask 0002 che fornisce al gruppo il permesso di scrittura a file e directory.

Red Hat 6 e CentOS 6

In queste distribuzioni la umask generico è scritta nel file /etc/bashrc, se si apre (come root) e si cerca nel file per la parola “umask” troverete qualcosa di simile a queste righe:

# By default, we want umask to get set. This sets it for non-login shell.
    # Current threshold for system reserved uid/gids is 200
    # You could check uidgid reservation validity in
    # /usr/share/doc/setup-*/uidgid file
    if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
       umask 002
    else
       umask 022
    fi

Queste linee impostano una umask di 002 per gli utenti il cui uid è maggiore di 199 ed hanno il nome del gruppo uguale al nome utente.
Quindi, per modificare l’umask per tutti si può semplicemente cambiare tutte queste linee in:

 umask 002

O qualsiasi altro valore di cui avete bisogno.

Popular Posts:

flattr this!

  2 Responses to “Linux shell: capire umask con esempi”

  1. Ciao,
    grazie per la guida molto utile. Ti segnalo un piccolo refuso nel punto 2)Cambiare la umask predefinita: hai scritto 662 per -rw-rw-r– mentre è 664 (è un refuso, infatti il calcolo poi è corretto: 666-664=002).

    Grazie ancora!
    Joe

 Leave a Reply

(required)

(required)


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>