Recientemente, estoy usando el sistema operativo del módulo Python, cuando intenté cambiar el permiso de un archivo, no obtuve el resultado esperado. Por ejemplo, tenía la intención de cambiar el permiso a rw-rw-r--,
os.chmod("/tmp/test_file", 664)
El permiso de propiedad es en realidad -w - wx --- (230)
--w--wx--- 1 ag ag 0 Mar 25 05:45 test_file
Sin embargo, si cambio 664 a 0664 en el código, el resultado es justo lo que necesito, por ejemplo
os.chmod("/tmp/test_file", 0664)
El resultado es:
-rw-rw-r-- 1 ag ag 0 Mar 25 05:55 test_file
¿Alguien podría ayudar a explicar por qué ese 0 inicial es tan importante para obtener el resultado correcto?
python
file
permissions
chmod
AplusG
fuente
fuente
Respuestas:
Encontré esto en un foro diferente
Lo que estás haciendo es pasar
664
que en octal es1230
En tu caso necesitarías
[Actualización] Nota, para Python 3 tienes el prefijo con 0o (cero oh). P.EJ,
0o666
fuente
1
se no descartan! Ese es el bit sticky / setuid / setgid, y 1 significasticky
. El usols -l
puede notar que los permisos ahora incluyen unT
al final ...Entonces, para las personas que quieren una semántica similar a:
Utilizar:
Si su Python es anterior a 2.6:
fuente
00755
, solo para dejar en claro a dónde van los bits suid / sgid / sticky, en caso de que algún desarrollador posterior venga y quiera hacer que este antiguo script use, por ejemplo, sgid con2755
pero luego no puedo entender por qué las permanentes están completamente arruinadas. ;)inicial
0
significa que es una constante octal , no decimal. y necesita un octal para cambiar el modo de archivo.los permisos son una máscara de bits, por ejemplo,
rwxrwx---
está111111000
en binario, y es muy fácil agrupar los bits por 3 para convertirlos al octal, que calcular la representación decimal.0644
(octal) está0.110.100.100
en binario (he agregado puntos para facilitar la lectura) o, como puede calcular,420
en decimal.fuente
Use símbolos de permiso en lugar de números
Su problema se habría evitado si hubiera utilizado los símbolos de permiso con nombres más semánticos en lugar de números mágicos en bruto, por ejemplo, para
664
:Esto está documentado en https://docs.python.org/3/library/os.html#os.chmod y los nombres son los mismos que los valores de la API POSIX C documentados en
man 2 stat
.Otra ventaja es la mayor portabilidad como se menciona en los documentos:
chmod +x
se demuestra en: ¿Cómo se hace un simple "chmod + x" desde dentro de Python?Probado en Ubuntu 16.04, Python 3.5.2.
fuente
Si ha guardado los permisos deseados en la cadena, hágalo
fuente
Usar las máscaras stat. * Bit me parece la forma más portátil y explícita de hacer esto. Pero, por otro lado, a menudo olvido cuál es la mejor manera de manejar eso. Entonces, aquí hay un ejemplo de enmascarar los permisos de 'grupo' y 'otros' y dejar los permisos de 'propietario' intactos. El uso de máscaras de bits y la resta es un patrón útil.
fuente