2009-12-07 8 views
46

Estoy escribiendo un script para verificar los permisos de los archivos en los directorios del usuario y si no son aceptables, los advierto, pero quiero verificar los permisos no solo de los que han iniciado sesión usuario, pero también grupo y otros. ¿Cómo puedo hacer esto? Me parece que .access() en Python solo puede verificar los permisos para el usuario que ejecuta el script.Comprobando los permisos de archivos en Linux con Python

Respuesta

78

Tiene razón en que os.access, como el syscall subyacente access, busca un usuario específico (ID reales en lugar de efectivos, para ayudar con las situaciones de suid).

os.stat es la forma correcta de obtener más información general sobre un archivo, incluidos los permisos por usuario, grupo y otros. El atributo st_mode del objeto que os.stat devuelve tiene los bits de permiso para el archivo.

Para ayudar a interpretar esos bits, es posible que desee utilizar el módulo stat. Específicamente, querrá las máscaras de bits definidas here, y usará el operador & (bit-and) para usarlas para enmascarar los bits relevantes en ese atributo st_mode, por ejemplo, si solo necesita un valor verdadero/falso comprobar si un determinado archivo es un grupo legible, un enfoque es: cuidado

import os 
import stat 

def isgroupreadable(filepath): 
    st = os.stat(filepath) 
    return bool(st.st_mode & stat.S_IRGRP) 

tomar: la llamada os.stat puede ser algo costoso, así que asegúrese de extraer toda la información que te importa con una sola llamada, en lugar de sigue repitiendo llamadas por cada bit de interés ;-).

+0

Maravilloso, esto es exactamente lo que esperaba encontrar. Muchas gracias. Acabo de empezar a buscar python para un pequeño proyecto en el trabajo, por lo que puedes decir que todavía estoy aprendiendo. ¡Muchas gracias! – jphenow

+0

Muy buena utilidad. ¡Gracias! – zerocog

7

Utilice os.access() con las banderas os.R_OK, os.W_OK y os.X_OK.

Editar: Consulte this related question si está probando permisos de directorio en Windows.

+5

que aún no ha leído la pregunta, os.access sólo comprueba los permisos de el usuario actual. –

8

Puede consultar los permisos de archivos a través del os.stat(path) junto con el módulo stat para interpretar los resultados.

1

sólo para ayudar a otras personas como yo que vinieron aquí por algo un poco diferente:

import os 
import stat 

st = os.stat(yourfile) 
oct_perm = oct(st.st_mode) 
print(oct_perm) 
>>> 0o100664 //the last 3 or 4 digits is probably what you want. 

ver este para más detalles: https://stackoverflow.com/a/5337329/1814774

Cuestiones relacionadas