Comprobando permisos de archivos en Linux con Python

Estoy escribiendo una secuencia de comandos para verificar los permisos de los archivos en los directorios de los usuarios y, si no son aceptables, los advertiré, pero quiero verificar los permisos no solo del usuario que ha iniciado sesión, sino también del grupo y otros. ¿Cómo puedo hacer esto? Me parece que os.access() en Python solo puede verificar los permisos para el usuario que ejecuta el script.

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

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

Para ayudar a interpretar esos bits, es posible que desee utilizar el módulo de estadísticas . Específicamente, querrá que las máscaras de bits se definan aquí y usará el operador & (bit-and) para usarlas para enmascarar los bits relevantes en ese atributo st_mode , por ejemplo, si solo necesita un Verdadero / Falso verifique si un determinado archivo es legible para grupos, un enfoque es:

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

Tenga cuidado: la llamada os.stat puede ser algo costosa, así que asegúrese de extraer toda la información que le interesa con una sola llamada, en lugar de repetir las llamadas para cada bit de interés ;-).

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

Utilice os.access() con los indicadores os.R_OK , os.W_OK y os.X_OK .

Edición : consulte esta pregunta relacionada si está probando permisos de directorio en Windows.

Solo 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. 

Vea esto para obtener más detalles: https://stackoverflow.com/a/5337329/1814774

os.stat y las máscaras de bits asociadas para el modo.