Puedo usar os.stat(pathname) para obtener permisos de pathname, mtime, atime.... Sin embargo, tengo un archivo que tiene un atributo '+i', puede verlo en: lsattr /tmp/test.py Is ¿Hay alguna manera de saber si la ruta tiene el atributo '+i' usando python?
No parece haber una función de módulo os para obtener estos atributos de archivo de Linux, pero puede usar el módulo de subprocess para llamar al comando lsattr en Python.
El siguiente código debería funcionar en Python 2 o 3, aunque se puede hacer más compacto en las versiones recientes de Python.
FWIW, tengo el bit i configurado en mi archivo fstab porque me cansé de que se borrara al azar.
import subprocess def is_immutable(fname): p = subprocess.Popen(['lsattr', fname], bufsize=1, stdout=subprocess.PIPE) data, _ = p.communicate() #print(data) return 'i' in data.split(None, 1)[0] print(is_immutable("/etc/fstab"))La versión anterior de este código tenía
return 'i' in data.splitSin embargo, eso también detectará una 'i' si hay una presente en el nombre del archivo. La nueva versión solo detecta una 'i' en las banderas de atributos. Gracias, sverasch por traer esto a mi atención.
Esta publicación SO relacionada sobre por qué os.chflags no existe en Linux muestra una forma de evitar la ausencia de lsattr en el módulo os usando fcntl . Sin embargo, se basa en copiar definiciones constantes de un archivo de encabezado (ext2fs/ext2_fs.h), por lo que es frágil. Una solución más permanente requeriría escribir algo de C o algo como Cython.
Mientras tanto, la respuesta de PM 2Ring funciona, aunque debe modificarse para que funcione con rutas que contengan la letra "i". ¿Quizás alguien con cierta reputación podría comentar o editar esa respuesta (esta es mi primera publicación)?
import subprocess def is_immutable(fname): p = subprocess.Popen(['lsattr', fname], bufsize=1, stdout=subprocess.PIPE) data, _ = p.communicate() #print(data) return 'i' in data def is_immutable_safe(file_path): """Check if the immutable flag is set on a Linux file path Uses the lsattr command, and assumes that the immutable flag appears in the first 16 characters of its output. """ return 'i' in subprocess.check_output(['lsattr', file_path])[:16] # These assertions will pass if the immutable bit is not set on # /etc/inittab on your system assert is_immutable('/etc/inittab') is True assert is_immutable_safe('/etc/inittab') is False