2012-04-24 13 views
8

Sto provando a impostare una umask usando il modulo os. Si prega di notare la mia umask normale impostato nel mio ~/.profile è umask 0027.Come utilizzare os.umask() in Python

In una shell bash,

umask 0022 

permetterà un file da creare con le autorizzazioni

-rw-r--r-- 

Tuttavia, quando siamo importazione il modulo os e fare questo:

os.umask(0022) 
[do some other code here that creates a file] 

ricevo i permessi di

---------- 

In primo luogo, come faccio a far sì che os.umask (maschera) si comporti come umask nella shell?

In secondo luogo, qual è la logica tra la differenza dei due?

Nota: Ho provato a convertire il 0022 al decimale nel caso in cui si aspetta un decimale facendo:

os.umask(18) 

ma ha dato i permessi di

-----w--w- 

Si noti inoltre, ho provato

os.umask(00022) 

e

os.mask(0o0022) 

Quale non ha funzionato neanche.

+0

E 'possibile il file esiste già ? In questo caso dovrai usare chmod –

+0

@gnibbler: No, è stato cancellato in precedenza, ma questa è una buona idea. – narnie

+0

@Ignacio Vazquez-Abrams: prova prima a impostare umask 0027 nella shell, poi esegui lo script o invoca il tuo interprete. – narnie

risposta

8

Avrete probabilmente bisogno di mostrarci il codice che costituisce:

[do some other code here that creates a file] 

Il codice si dispone funziona bene sul mio sistema:

import os 
oldmask = os.umask (022) 
fh1 = os.open ("qq1.junk", os.O_CREAT, 0777) 
fh2 = os.open ("qq2.junk", os.O_CREAT, 0022) 
os.umask (oldmask) 
os.close (fh1) 
os.close (fh2) 

file che producono come segue:

-rwxr-xr-x 1 pax pax 0 Apr 24 11:11 qq1.junk 
---------- 1 pax pax 0 Apr 24 11:11 qq2.junk 

Si noti inoltre il ripristino del vecchio valore umask che riduce al minimo l'impatto di cambiarlo all'operazione locale.

Come puoi vedere dai risultati sopra riportati, devi anche essere consapevole che il valore umask viene "sottratto" dalla modalità che stai utilizzando per creare il file e non sappiamo quale sia quella modalità nel tuo caso particolare.

Questo è evidente anche nella vostra bash campione in quanto un valore di umask022 durante la creazione di un file di modalità 777 porterebbe a r-xr-xr-x, non rw-r--r-- come lo avete.


In base alle vostre osservazioni qui sotto in cui si indica che si sta utilizzando open piuttosto che os.open, una rapida occhiata della sorgente Python sembra indicare che questo si traduce in un C fopen chiamata che utilizza 0666 come modalità iniziale. Questo è supportato dal codice leggermente modificato:

import os 
oldmask = os.umask (022) 
fh3 = open ("qq3.junk", "w") 
os.umask (0) 
fh4 = open ("qq4.junk", "w") 
os.umask (oldmask) 
fh3.close() 
fh4.close() 

che ci dà:

-rw-r--r-- 1 pax pax 0 Apr 24 11:44 qq3.junk 
-rw-rw-rw- 1 pax pax 0 Apr 24 11:44 qq4.junk 

quindi non sono del tutto certo il motivo per cui stai ricevendo 0000 autorizzazioni in vostro caso.

Vale la pena vedere quali sono i risultati quando si esegue quel programma sopra nel proprio ambiente. Se è lo stesso che ho allora il problema potrebbe risiedere altrove.

+0

Ho fatto nella shell bash, umask 0022 poi ha fatto touch/tmp/test poi ha fatto ls -l/tmp/test hanno copiato e incollato le autorizzazioni direttamente qui sopra.Penso che tu stia confondendo la differenza tra la creazione di file (laddove si presume che l'esecuzione non sia desiderata) e la creazione di directory (dove si presume che le autorizzazioni di esecuzione siano deside- rate) – narnie

+0

@narnie, questo dipende _ esclusivamente da ciò che il codice sta creando il file. Ovviamente 'touch' ha regole diverse per, ad esempio,' ld' in termini di modalità che usa. Tutto quello che stavo dicendo è che i permessi del file dipendono dal valore 'umask' _e dalla modalità, e il codice mancante è il bit che ci direbbe la modalità. – paxdiablo

+0

il codice che sto usando per generare il file è piuttosto complesso dato che sto passando i gestori di file. Voglio che la umask sia 0022, non importa a quale umask del profilo potrebbe essere impostato (il mio è impostato su 0027). Il jist è che sto semplicemente facendo f = open (filename, 'w') quindi passando l'oggetto file su una classe che controlla un oggetto generale che ha un metodo write che usa l'oggetto f per scrivere l'oggetto, restituisce, dove viene eseguito f.close(). – narnie

5

Essendo compatibile 3k-schizzinosi/attenta, e Python, ecco la mia risposta leggermente diversa (che ancora non spiega che cosa problema originale del PO era):

old_umask = os.umask(0o022) # u=rwx,g=rx,o=rx 
try: 
    # do stuff 

finally: 
    os.umask(old_umask) 
+0

Non compatibile con 2.x; 2.x umask è una chiamata di sistema diretta che richiede un numero intero e genera TypeError su ottale. –

+0

@JamiesonBecker sembra funzionare su 2.7.13 –

+0

@CraigYounkins hai ragione! Non sono sicuro da dove l'ho preso. :) –

6

Malinteso di umask, credo. La umask imposta il numero predefinito rifiuti, non le autorizzazioni predefinite . Così

import os 
oldmask = os.umask (022) 
fh1 = os.open ("qq1.junk", os.O_CREAT, 0777) 
fh2 = os.open ("qq2.junk", os.O_CREAT, 0022) 
os.umask (oldmask) 
os.close (fh1) 
os.close (fh2) 

dovrebbe infatti produrre file come segue:

-rwxr-xr-x 1 pax pax 0 Apr 24 11:11 qq1.junk 
---------- 1 pax pax 0 Apr 24 11:11 qq2.junk 

Umask 022 rimuove l'accesso in scrittura per il gruppo e gli altri, che è esattamente il comportamento che vediamo lì. Trovo aiuta a tornare al binario che i numeri ottali rappresentano:

usr grp others 
-rwx rwx rwx is represented in octal as 0777, requested for qq1.junk 
-000 010 010 umask of 022 removes any permission where there is a 1 
-rwx r-x r-x is the result achieved requesting 0777 with umask of 022 

---- -w- -w- is represented in octal as 0022, requested for qq2.junk 
-000 010 010 umask of 022 removes any permission where there is a 1 
---- --- --- is the result achieved requesting 0022 with umask of 022 

Il programma si comporta come lei ha chiesto a, non necessariamente come si pensava dovrebbe. situazione comune, che, con i computer :-)

+0

'umask 022' dovrebbe risultare in' 755'permissions per le directory, ma non per i file. Per i file dovrebbe essere '644'. O in altre parole, con le directory 'umask 022' dovrebbe essere' rwxr-xr-x', ma i file dovrebbero essere 'rw-r - r -'. – Dominik

0

Anche se questo sembra essere una chiamata di sistema rettilineo, in questo caso lo fa sembra avere importanza quale versione di Python che si sta utilizzando:

Sembra che os. open gestisce l'umask preesistente in modo diverso in Python 2.xe Python 3.x, probabilmente perché 2.x è più vicino al sistema operativo e 3.x fa un po 'più di astrazione.

https://docs.python.org/2/library/os.html "La modalità di default è 0777 (ottale), e il valore umask corrente viene prima mascherati."

Non v'è alcuna dichiarazione simile in https://docs.python.org/3/library/os.html

Problemi correlati