Che cos'è "umask" e come funziona?


190

Credo che umask sia qualcosa che controlla i permessi dei file , ma non lo capisco completamente.

Dopo l'esecuzione umask 0644in un terminale , non riesco a leggere i file che creo con l'editor di testo della riga di comando nano. Ho notato che le autorizzazioni di quel file sono impostate su 0022invece che sul valore predefinito 0755.

Come funziona umask? Ho pensato che avrei potuto solo rimuovere il ogni cifra nella umask da 0777, 7 - 6 = 1e 7 - 4 = 3, quindi mi aspetto che i permessi siano 0133, ma a quanto pare, questo non è il caso.

  1. Che cos'è esattamente umask? Spiegamelo come se fossi un "noob Linux"
  2. Come posso calcolare con umask?
  3. Quali sono i casi d'uso di umask?

app_mode 666 rw- rw- rw- umask 644 --0 -00 -00 file_mode 022 --- -w- -w-
Grabantot,

Risposte:


143

Umask funge da insieme di autorizzazioni che le applicazioni non possono impostare sui file. È una maschera di creazione della modalità file per i processi e non può essere impostata per le directory stesse. La maggior parte delle applicazioni non creerebbe file con le autorizzazioni di esecuzione impostate, quindi avrebbero un valore predefinito di 666, che verrà quindi modificato da umask.

Poiché hai impostato umask per rimuovere i bit di lettura / scrittura per il proprietario e i bit di lettura per gli altri, un valore predefinito come 777nelle applicazioni comporterebbe l'autorizzazione dei file 133. Ciò significherebbe che tu (e altri) potreste eseguire il file e che altri potrebbero scriverlo.

Se vuoi fare in modo che i file non vengano letti / scritti / eseguiti da chiunque tranne che dal proprietario, dovresti usare un umask come 077per disattivare quelle autorizzazioni per il gruppo e altri.

Al contrario, un umask di 000renderà le directory appena create leggibili, scrivibili e descrivibili per tutti (i permessi saranno 777). Una simile umask è altamente insicura e non dovresti mai impostarla 000.

L'umask predefinito su Ubuntu era 022che significa che i file appena creati sono leggibili da tutti, ma scrivibili solo dal proprietario:

user@computer:~$ touch new-file-name
user@computer:~$ ls -dl new-file-name
-rw-r--r-- 1 user user 0 Apr  1 19:15 new-file-name

A partire da Ubuntu Oneiric (11.10) è stata rilassata l'umask predefinita 002, che espande l'accesso in scrittura al gruppo del proprietario:

user@computer:~$ touch new-file-name
user@computer:~$ ls -dl new-file-name
-rw-rw-r-- 1 user user 0 Apr  1 19:15 new-file-name

Visualizzazione e modifica di umask

Per visualizzare l'impostazione umask corrente, aprire un terminale ed eseguire il comando:

umask

Per modificare l'impostazione umask della shell corrente in qualcos'altro, dire 077, eseguire:

umask 077

Per verificare se questa impostazione funziona o meno, è possibile creare un nuovo file (le autorizzazioni di un file esistente non saranno interessate) e mostrare informazioni sul file, eseguire:

user@computer:~$ touch new-file-name
user@computer:~$ ls -dl new-file-name
-rw------- 1 user user 0 Apr  1 19:14 new-file-name

L'impostazione umask è ereditata dai processi avviati dalla stessa shell. Ad esempio, avvia l'editor di testo GEdit eseguendolo geditnel terminale e salva un file usando gedit. Noterai che il file appena creato è influenzato dalla stessa impostazione umask del terminale.

Caso d'uso: sistema multiutente

Se si utilizza un sistema condiviso da più utenti, si desidera che altri non possano leggere i file nella propria directory home. Per questo, un'ombra è molto utile. Modifica ~/.profilee aggiungi una nuova riga con:

umask 007

È necessario effettuare nuovamente l'accesso per ~/.profilerendere effettiva questa modifica umask . Successivamente, è necessario modificare le autorizzazioni dei file esistenti dei file nella home directory rimuovendo il bit di lettura, scrittura ed esecuzione per il mondo. Apri un terminale ed esegui:

chmod -R o-rwx ~

Se si desidera applicare questa impostazione umask a tutti gli utenti del sistema, è possibile modificare il file di profilo a livello di sistema in /etc/profile.


3
Quindi, cosa significano le cifre nell'ombra? Perché 777significa che il gruppo e gli altri saranno in grado di scrivergli, mentre 077significa che non possono?
Ciao addio

3
Inoltre, dici che se l'umask è 000, l'autorizzazione del file sarà 777. Quindi, con una maschera predefinita di 022, i permessi dei file non dovrebbero essere 755, cioè corrispondenti a -rwxr-xr-x, no -rw-r--r--?
Ciao addio

13
Devo ammettere che questa spiegazione mi ha confuso più di quanto non mi abbia aiutato.
Connel Hooley,

8
nota che l'umask predefinito di Ubuntu è cambiato in 0002 solo un mese dopo che questa risposta è stata pubblicata.
Jeff Puckett,

7
@HelloGoodbye se l'umask è 000quindi nessuna autorizzazione verrà rimossa. le applicazioni gradiscono touche nanocreano file con impostazione predefinita in 666modo che l'autorizzazione del file rimanga, 666ma una umask 022rimuoverà i bit di scrittura per il gruppo e altri, quindi 666viene ridotta a 644aka -rw-r--r--Considerare mkdirquale modalità di creazione predefinita 777con un'umask 022ridurrà le autorizzazioni a755
Jeff Puckett il

38

Oltre alla buona discussione nella risposta accettata, vale la pena aggiungere alcuni punti in più umask, con riferimento a come viene gestita in 12.04 e in seguito.

Umask e pam_umask

L'umask predefinito è ora in /etc/login.defse non in /etc/profile, come /etc/profiledice la nota ufficiale in :

# The default umask is now handled by pam_umask.
# See pam_umask(8) and /etc/login.defs.

Pam_umaskviene brevemente spiegato di seguito, e si dovrebbe dire che il file predefinito in cui l'utente deve inserire le sue impostazioni umask personalizzate è ancora ~/.profile.

Pam_umaskè uno dei tanti moduli PAM importanti che sono cruciali nel funzionamento di Ubuntu (corri apropos '^pam_'per trovare le manpage degli altri). Nella manpage per pam_umasksi osserva che

pam_umask è un modulo PAM per impostare la maschera di creazione della modalità file dell'ambiente corrente. La umask influisce sulle autorizzazioni predefinite assegnate ai file appena creati.

Una nota sull'umask predefinito

$HOMEÈ possibile creare nuove cartelle mkdircon autorizzazioni 775 predefinite e file creati con touchautorizzazioni 664 predefinite anche quando l'umask predefinito è 022. Questo sembra, inizialmente, contraddittorio, e vale la pena spiegare.

Mentre umask predefinito è 022 su Ubuntu, questa non è l'intera storia, in quanto esiste un'impostazione /etc/login.defsche consente a umask di essere 002 per utenti non root se viene soddisfatta una condizione (vedere estratto di seguito). In un'installazione normale, /etc/login.defscontiene l'impostazione USERGROUPS_ENAB yes. Questo è ciò

Abilita l'impostazione dei bit del gruppo umask in modo che corrisponda ai bit del proprietario (esempi: 022 -> 002, 077 -> 007) per utenti non root, se l'UID è uguale a GID e il nome utente è lo stesso del primario nome del gruppo.

Ecco perché visualizzi quanto segue con statquando viene creata una nuova cartella con mkdirsu un singolo sistema utente come mio (uid e gid sono uguali):

Access: (0775/drwxrwxr-x)  Uid: ( 1000/username)   Gid: ( 1000/username)

Per ulteriori informazioni, consultare man pam_umaske le manpage di Ubuntu online .


Sembra che nella tua seconda parte manchi qualcosa? (USERGROUP_ENABLE?) +1 per informazioni aggiornate
Lekensteyn

2
@Lekensteyn Stranamente, l'impostazione /etc/login.defsè sicuramente USERGROUPS_ENAB yesdopo averlo verificato. La sintassi di quel file è leggermente insolita.

Ho appena controllato il file e la fonte e hai ragione, questa (e alcune altre) impostazioni sono confuse con il nome "_ENAB".
Lekensteyn,

34

È piuttosto vecchio, ma vale la pena menzionarlo. Per calcolare per l'umask, a differenza delle autorizzazioni del file system. Le umask ottali sono calcolate tramite AND bit per bit del complemento unario dell'argomento usando NOT bit per bit. Le notazioni ottali sono le seguenti:

Octal value : Permission
0 : read, write and execute
1 : read and write
2 : read and execute
3 : read only
4 : write and execute
5 : write only
6 : execute only
7 : no permissions

Quindi puoi calcolare per impostare le giuste premesse umask come:

$ umask 077
$ mkdir dir1
$ touch file
$ ls -ld dir1 file

drwx------ 2 amrx amrx 4096 2011-03-04 02:05 dir1
-rw------- 1 amrx amrx    0 2011-03-04 02:05 file

Calcolo dell'autorizzazione finale per i file

Puoi semplicemente sottrarre umask dalle autorizzazioni di base per determinare l'autorizzazione finale per il file come segue:

666 – 022 = 644
  • Autorizzazioni per file base: 666
  • valore umask: 022
  • sottrai per ottenere le autorizzazioni per il nuovo file (666-022):644 (rw-r–r–)

Calcolo dell'autorizzazione finale per le directory

Puoi semplicemente sottrarre umask dalle autorizzazioni di base per determinare l'autorizzazione finale per la directory come segue:

777 – 022 = 755
  • Autorizzazioni di base directory: 777
  • valore umask: 022
  • Sottrai per ottenere le autorizzazioni per la nuova directory (777-022):755 (rwxr-xr-x)

3
Non credo sia così che vengono calcolati i permessi finali, e se il valore di smascheramento è 077come sottraresti 666-077in quel caso?
Sufiyan Ghori,

6
La spiegazione di @SufiyanGhori Baron non è completa per l'autorizzazione dei file. Nel tuo caso e in qualsiasi calcolo futuro, per essere facile da ricordare, dovresti tenere a mente di sottrarli in questo modo: 6-0 6-7 6-7 se qualsiasi risultato di questi tre è -1, allora lascia che sia 0. Quindi noi hanno il risultato finale 600
Huy.PhamNhu,

1
@ Huy.PhamNhu Neanche questo è corretto. Con l'autorizzazione di base di 666 e umask di 033 sicuramente non otterrai 633.
maaartinus,

7
No no no Non è possibile utilizzare la sottrazione per calcolare umask (funziona con determinati valori, ma non tutti). Devi pensare all'umask come "disabilita i bit". Vedi le altre risposte di Sufiyan e Wisbucky.
Wisbucky,

33

Altri hanno risposto hanno spiegato molto bene il concetto di umasking e perché è necessario. Vorrei aggiungere il mio due centesimi e darvi un esempio matematico su come vengono effettivamente calcolate le autorizzazioni.

Prima di tutto, "Maschera" non significa "sottrarre", in senso aritmetico - non vi è alcun prestito o trasporto, in secondo luogo, umaskè una maschera; non è un numero da sottrarre.

Terzo, la maschera disattiva i bit di autorizzazione. Se sono già disattivati, umasknon apportano modifiche all'autorizzazione,

Ad esempio, supponiamo che sia necessario smascherare 077dalle impostazioni predefinite del sistema per i file che sono 666e le directory che sono 777.

Il comando che userete è,

umask 077

(smascherare il valore in binario, 000 111 111)

Ciò che questo smascheramento farà è che spegnerà uno dei primi sei LSB (bit meno significativi) se lo sono 1e non cambierà se nessuno di essi è già spento.

Ecco come viene calcolata l'autorizzazione finale:

file permisison 666 = 110 110 110 
unmask value    077 = 000 111 111
will result in, 600 = 110 000 000

Osservare come entrambi i 110valori sono cambiati in 000.

Allo stesso modo,

directory permission 777 = 111 111 111 
unmask value         077 = 000 111 111
will result in,      700 = 111 000 000

7
questa dovrebbe essere la risposta!
Abdelouahab,

@SufiyanGhori Quindi, se umask 177(001 111 111), spegnerà i primi 7 bit meno significativi se lo sono1
Kasun Siyambalapitiya,

che è corretto @KasunSiyambalapitiya
Sufiyan Ghori

1
così è la formularesult = file permission & (!umask)
Eric Hodgins il

1
@EricHodgins: Sì, esattamente.
Amit Naidu, il

15

Concetto di base:

Se siete come la maggior parte degli umani e non capite cosa diavolo significhi "umasks ottali calcolati tramite AND bit per bit del complemento unario dell'argomento usando NOT bit per bit" , ecco la mia semplice spiegazione:

Prima di tutto, pensa a cosa sia una "maschera". Una maschera blocca qualcosa. Pensa al nastro adesivo. In questo caso, umask è come mascherare il nastro per bloccare / disabilitare le autorizzazioni durante la creazione di un nuovo file o directory.

Le autorizzazioni predefinite durante la creazione di octal 777 (111 111 111)una nuova directory sono e un nuovo file è octal 666 (110 110 110). Abbiamo impostato umask per bloccare / disabilitare determinate autorizzazioni.

  • Un bit di maschera 1significa bloccare / disabilitare tale autorizzazione (collocare il nastro protettivo su quel bit).
  • Un bit di maschera 0consentirà il passaggio del permesso (nessun nastro di mascheramento su quel bit).

Così una octal 022 (000 010 010)maschera mezzi per disabilitare group writee others write, e consentire tutte le altre autorizzazioni di passare attraverso.

Calcolo:

Ecco un esempio di calcolo per un nuovo file (autorizzazione predefinita 666) con un umask 022:

  perm mask result
----------------------------
u 1    0    1 (pass through)
  1    0    1 (pass through)
  0    0    0 (pass through)
----------------------------
g 1    0    1 (pass through)
  1    1    0 (disable)
  0    0    0 (pass through)
----------------------------
o 1    0    1 (pass through)
  1    1    0 (disable)
  0    0    0 (pass through)

Ecco come si finisce con il risultato di 644 quando si crea un nuovo file.

Modo più semplice:

Ma se i calcoli della maschera inversa ti confondono, c'è un modo più semplice usando la notazione simbolica di umask. Quando si utilizza questo metodo, si specificano solo i bit pass-through anziché i bit della maschera.

  • umask u=rwx,g=rx,o=rxmezzi consentono passare per user rwx, group rx, other rx. Il che implica disable group w, others w. Se esegui questo comando umask, controlla , otterrai 022.
  • umask u=rwx,g=,o=significa consentire il passaggio per user rwx. Ciò implica disabilitare tutti gli accessi per groupe others. Se esegui questo comando umask, controlla , otterrai 077.

Calcolo del bonus:

Se vuoi veramente capire cosa significa "umask ottali calcolati tramite AND bit per bit del complemento unario dell'argomento usando NOT bit per bit" , ecco alcune tabelle logiche che possono aiutare a dimostrare. Ricorda, un bit maschera 1significa disabilita, 0significa passare.

perm mask result
----------------
0    1    0     (mask 1 always disables)
1    1    0     (mask 1 always disables)
0    0    0     (mask 0 passes through)
1    0    1     (mask 0 passes through)

Se fai la tabella con NOT(mask), ora è solo una semplice ANDtabella logica!

perm NOT(mask) result
---------------------
0    0         0     (mask 1 always disables)
1    0         0     (mask 1 always disables)
0    1         0     (mask 0 passes through)
1    1         1     (mask 0 passes through)

Quindi la formula è: result = perm AND (NOT mask)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.