2012-04-24 11 views
8

Estoy tratando de configurar umask usando el módulo os. Tenga en cuenta que mi máscara de usuario normales ajustados en mi ~/.profile es umask 0027.Cómo usar os.umask() en Python

En bash,

umask 0022 

permitirá que un archivo se crea con permisos

-rw-r--r-- 

Sin embargo, cuando nos importamos el módulo os y haremos esto:

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

consigo permisos de

---------- 

En primer lugar, ¿cómo puedo hacer que os.umask (máscara) se comporte como umask en el shell?

En segundo lugar, ¿cuál es la lógica entre la diferencia de los dos?

Nota: He intentado convertir el 0022 a decimal en caso de que se espera un número decimal por hacer:

os.umask(18) 

pero dio permisos de

-----w--w- 

También tenga en cuenta, que intentó

os.umask(00022) 

y

os.mask(0o0022) 

Que tampoco funcionó.

+0

¿Es posible que el archivo ya existe ? En su lugar, deberá usar chmod en ese caso –

+0

@gnibbler: No, se eliminó antes, pero eso es una buena idea. – narnie

+0

@Ignacio Vazquez-Abrams: primero intente configurar umask 0027 en el shell, luego ejecute el script o invoque a su intérprete. – narnie

Respuesta

8

Usted va a necesitar para mostrarnos el código que constituye:

[do some other code here that creates a file] 

El código que tiene funciona bien en mi 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) 

archivos que producen de la siguiente manera:

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

También debe tener en cuenta la restauración del antiguo valor umask que minimiza el impacto de cambiarlo a la operación local.

Como puede ver en los resultados anteriores, también debe tener en cuenta que el valor umask se "resta" del modo que está utilizando para crear el archivo y no sabemos cuál es ese modo en su caso particular.

Eso es evidente incluso en su muestra bash desde un valor de umask022 al crear un archivo de modo 777 resultaría en r-xr-xr-x, no rw-r--r-- como lo tienes.


Sobre la base de sus comentarios a continuación donde se indique que está utilizando en lugar de openos.open, una simple mirada de la fuente de Python parece indicar que esto se traduce en un C fopen llamada que utiliza 0666 como el modo inicial. Esto es apoyado por el código ligeramente modificado:

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() 

que nos da:

-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 

así que no estoy del todo seguro de por qué recibe 0000 permisos en su caso.

Valdría la pena ver cuáles son los resultados cuando ejecuta ese programa anterior en su entorno. Si es lo mismo que recibo, entonces el problema puede estar en otro lugar.

+0

Lo hice en el shell bash, umask 0022 luego tocó/tmp/test y luego lo hizo ls -l/tmp/test copiaron y pegaron los permisos directamente arriba. Creo que está confundiendo el diferencial entre crear archivos (donde se supone que no se ejecuta) y crear directorios (donde se supone que se ejecutan los permisos deseados). – narnie

+0

@narnie, esto depende _entirely_ de qué código está creando el archivo. Obviamente 'touch' tiene reglas diferentes a, digamos,' ld' en términos del modo que usa. Todo lo que estaba diciendo es que los permisos del archivo dependen del valor 'umask' y el modo, y el código que falta es el que nos dice el modo. – paxdiablo

+0

el código que estoy usando para generar el archivo es bastante complejo ya que estoy aprobando manejadores de archivos. Quiero que umask sea 0022 sin importar a qué se haya configurado .profile umask (el mío está configurado en 0027). El jist es que estoy haciendo f = open (nombre de archivo, 'w') y pasando el objeto de archivo a una clase que controla un objeto general que tiene un método de escritura que usa el objeto f para escribir el objeto, devuelve, donde se ejecuta f.close(). – narnie

5

Al ser compatible 3k-exigente/cuidado, y Python, aquí es mi ligeramente diferente respuesta (que todavía no explica lo que era tema original de la OP):

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

finally: 
    os.umask(old_umask) 
+0

No es compatible con 2.x; 2.x umask es una llamada directa al sistema que requiere un entero y arroja TypeError en octal. –

+0

@JamiesonBecker parece funcionar en 2.7.13 –

+0

@CraigYounkins ¡tienes razón! No estoy seguro de dónde saqué eso. :) –

6

Falta de comprensión de la máscara U, creo. La umask establece las denegaciones predeterminadas , no la predeterminada permisos. Así

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) 

debería de hecho producir archivos de la siguiente manera:

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

La máscara de usuario 022 elimina el acceso de escritura para el grupo y otros, que es exactamente el comportamiento que vemos allí. me parece que ayuda a volver a la binaria que los números octales representan:

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 

El programa se comporta como lo pidió que, no necesariamente como usted pensaba que debería. situación común, que, con los ordenadores :-)

+0

'umask 022' debería dar como resultado' 755'permissions para directorios, pero no para archivos. Para los archivos, debe ser '644'. O en otras palabras, con los directorios 'umask 022' debe ser' rwxr-xr-x', pero los archivos deben ser 'rw-r - r -'. – Dominik

0

pesar de que esto parece ser una llamada al sistema recta, en este caso lo hace parece importar qué versión de Python que esté utilizando:

Parece que os. open maneja la umask preexistente de forma diferente en Python 2.xy Python 3.x, posiblemente porque 2.x está más cerca del sistema operativo y 3.x hace un poco más de abstracción.

https://docs.python.org/2/library/os.html "El modo por defecto es 0777 (octal), y el valor umask actual está enmascarado primero en salir."

no hay ninguna declaración similar en https://docs.python.org/3/library/os.html

Cuestiones relacionadas