Estoy tratando de cambiar los permisos de un archivo de acceso:

os.chmod(path, mode)

Quiero hacer es de sólo lectura:

os.chmod(path, 0444)

¿Hay alguna otra manera de hacer un archivo de sólo lectura?

  • He visto algunos como S_IRUSR..¿cómo funciona esto???
  • creo que es sólo la configuración de un poco así que cuando usted o ellos juntos obtendrá 0444
  • Si te refieres a preguntar «¿cómo puedo usar simbólico permiso de nombres y lo que significan», su articulación es seriamente dañada.
  • Tienes alguna solución .. ?
InformationsquelleAutor Abul Hasnat | 2013-04-27

6 Comentarios

  1. 61
    os.chmod(path, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)

    stat

    Los siguientes indicadores pueden también ser utilizado en el modo de argumento de
    os.chmod():

    stat.S_ISUID Set UID poco.

    stat.S_ISGID Set-group-ID bits. Este bit tiene varios usos especiales. Para
    un directorio que indica que la semántica BSD es para ser utilizado para que
    directorio: archivos creados no heredan su ID de grupo de la
    directorio, no desde el ID de grupo efectivo del proceso de creación,
    y directorios creados allí también tendrá la S_ISGID conjunto de bits. Para un
    archivo que no tiene el bit de ejecución de grupo (S_IXGRP) establecer, el
    set-group-ID bit indica obligatorio archivo/registro de bloqueo (véase también
    S_ENFMT).

    stat.S_ISVTX Sticky bit. Cuando este bit se establece en un directorio que significa
    que un archivo en ese directorio puede ser cambiado de nombre o eliminado sólo por la
    el propietario del archivo, el propietario del directorio, o por un entorno privilegiado
    proceso.

    stat.S_IRWXU Máscara para el archivo de permisos de propietario.

    stat.S_IRUSR Propietario tiene permiso de lectura.

    stat.S_IWUSR Propietario tiene permiso de escritura.

    stat.S_IXUSR Propietario tiene permiso de ejecución.

    stat.S_IRWXG , La máscara de permisos de grupo.

    stat.S_IRGRP Grupo tiene permiso de lectura.

    stat.S_IWGRP Grupo tiene permiso de escritura.

    stat.S_IXGRP Grupo tiene permiso de ejecución.

    stat.S_IRWXO , La máscara de permisos para los demás (no en grupo).

    stat.S_IROTH Otros tienen permiso de lectura.

    stat.S_IWOTH Otros tienen permiso de escritura.

    stat.S_IXOTH Otros tienen permiso de ejecución.

    stat.S_ENFMT Sistema V archivo de bloqueo de la aplicación. Este indicador es compartida
    con S_ISGID: archivo/registro se exige el bloqueo de archivos que no
    tiene el bit de ejecución de grupo (S_IXGRP) set.

    stat.S_IREAD Unix V7 sinónimo de S_IRUSR.

    stat.S_IWRITE Unix V7 sinónimo de S_IWUSR.

    stat.S_IEXEC Unix V7 sinónimo de S_IXUSR.

    • Las constantes en stat son sólo la conveniencia legible de azúcar. S_IRUSR es 0400, S_IRGRP se 040, S_IROTH es 4; la combinación de ellos con un bit a bit O rendimientos 0444. Sólo podría agregar en el lugar, pero en el caso general, O es correcto porque va a trabajar incluso si hay superposición de bits (0444 O 0444 es 0444, mientras que la adición daría un valor incorrecto).
    • El uso de + también parece funcionar en lugar de |. No sé si hay una razón para utilizar una encima de la otra.
    • No hay ninguna explicación sobre esto, usted tiene que leer los comentarios de los comentarios o el enlace a entender, a menos que usted ya sabe qué stat hace. Sólo un poco de explicación sería mucho mejor.
    • es más apropiado cuando la combinación de bits de los dos máscaras de bits. Sin embargo, si el cada máscara tiene un solo, separado de un conjunto de bits, como todas las constantes en la respuesta de arriba, a continuación, + es equivalente.
    • Tienes que ver el ingenio de + a la hora de manipular un preexistentes modo. Si el modo está establecido, a continuación, + no trabajo pero | voluntad. E. g., mode = stat.S_IWUSR + stat.S_IRUSR; ... some code ...; mode = mode + stat.S_IWUSR; no funciona pero el último comando funcionará con |.
  2. 28

    os.chmod(path, 0444) es el comando Python para cambiar los permisos de archivo en Python 2.x. Para una combinación de Python 2 y Python 3 solución, cambiar 0444 a 0o444.

    Siempre se puede usar Python para llamar el comando chmod utilizando subproceso. Creo que esto sólo funcionará en Linux, aunque.

    import subprocess
    
    subprocess.call(['chmod', '0444', 'path'])
    • os.chmod puede ser el derecho de la función, pero 0444 (en os.chmod(path, 0444)) como un int va a causar un SyntaxError (debido a la 0 a la izquierda), y en forma de cadena que no le dará el efecto deseado. Usted tiene que traducir el número para el sistema de los números el método que se utiliza, que no es lo mismo. Tal vez ya lo sabía, pero otros no pueden saber.
    • No importa mi comentario! Lo Siento Inbar Rosa. Estás bien. Al parecer, 0444 funciona muy bien en Python 2.x. Se hace un SyntaxError en Python 3.x, sin embargo. Para solucionarlo, basta con hacer 0o444 lugar en Python 3.x.
    • Este no es trabajo para un archivo en otro servidor. Por favor, puedes sugerir para ese caso. Gracias
    • Una versión independiente de la forma de producir un número octal sería: int(«444», 8) Nota, sin embargo, que la otra respuesta, lo que sugiere el uso simbólico de los valores definidos en el módulo de estadísticas es, probablemente, la más limpia.
  3. 15

    Todas las respuestas de darle una paliza a la no escrito permisos: hacen que el archivo legible-pero-no-ejecutable para todo el mundo. Concedido, esto es debido a que la pregunta inicial que pidió 444 permisos — pero podemos hacerlo mejor!

    He aquí una solución que deja a todo el individuo «leer» y «ejecutar» bits sin tocar. Escribí detallado código para que sea fácil de entender, usted puede hacer que sea más conciso si te gusta.

    import os
    import stat
    
    def remove_write_permissions(path):
        """Remove write permissions from this path, while keeping all other permissions intact.
    
        Params:
            path:  The path whose permissions to alter.
        """
        NO_USER_WRITING = ~stat.S_IWUSR
        NO_GROUP_WRITING = ~stat.S_IWGRP
        NO_OTHER_WRITING = ~stat.S_IWOTH
        NO_WRITING = NO_USER_WRITING & NO_GROUP_WRITING & NO_OTHER_WRITING
    
        current_permissions = stat.S_IMODE(os.lstat(path).st_mode)
        os.chmod(path, current_permissions & NO_WRITING)

    ¿Por qué funciona esto?

    Como Juan de La Rooy señaló,stat.S_IWUSR significa, básicamente, «la máscara de bits para el usuario con permisos de escritura». Queremos establecer el permiso correspondiente bit a 0. Para hacer eso, necesitamos la exactamente lo contrario máscara de bits (es decir, uno con un 0 en esa ubicación, y 1 en todas partes). El ~ operador, que se despliega todos los bits, nos da exactamente eso. Si aplicamos esto a cualquier variable a través de la «bit a bit y» operador (&), se pondrá a cero el bit correspondiente.

    Que tenemos que repetir esta lógica con el «grupo» y «otros» bits de permiso, demasiado. Aquí se puede ahorrar algo de tiempo &‘ing todos ellos juntos (formando el NO_WRITING de bits constante).

    El último paso es obtener la corriente de los permisos de fichero, y realizar realmente el bit a bit y operación.

    • parece que tiene que ser más concisa forma de hacerlo.
  4. 0

    No hay necesidad de recordar las banderas. Recuerda que siempre puedes hacer:

    subprocess.call(["chmod", "a-w", "file/path])

    No portátil, pero fácil de escribir y recordar:

    • u – usuario
    • g – grupo
    • o – otras
    • un – todos los
    • + o – (agregar o quitar permiso)
    • r – leer
    • w – escritura
    • x – ejecutar

    Consulte man chmod para opciones adicionales y una explicación más detallada.

    • El principal problema con este enfoque es que asume que es un sistema similar a Unix. Esto no es portable ya que no funciona en Windows. Usted debe estar utilizando os.chmod como se sugiere en el Gitano de la respuesta.
  5. 0

    FYI aquí es una función para convertir una cadena de permiso con 9 caracteres (por ejemplo, ‘rwsr-x-wt’) a una máscara que puede ser utilizado con os.chmod().

    def perm2mask(p):
    
        assert len(p) == 9, 'Bad permission length'
        assert all(p[k] in 'rw-' for k in [0,1,3,4,6,7]), 'Bad permission format (read-write)'
        assert all(p[k] in 'xs-' for k in [2,5]), 'Bad permission format (execute)'
        assert p[8] in 'xt', 'Bad permission format (execute other)'
    
        m = 0
    
        if p[0] == 'r': m |= stat.S_IRUSR 
        if p[1] == 'w': m |= stat.S_IWUSR 
        if p[2] == 'x': m |= stat.S_IXUSR 
        if p[2] == 's': m |= stat.S_IXUSR | stat.S_ISUID 
    
        if p[3] == 'r': m |= stat.S_IRGRP 
        if p[4] == 'w': m |= stat.S_IWGRP 
        if p[5] == 'x': m |= stat.S_IXGRP 
        if p[5] == 's': m |= stat.S_IXGRP | stat.S_ISGID 
    
        if p[6] == 'r': m |= stat.S_IROTH 
        if p[7] == 'w': m |= stat.S_IWOTH 
        if p[8] == 'x': m |= stat.S_IXOTH 
        if p[8] == 't': m |= stat.S_IXOTH | stat.S_ISVTX
    
        return m

    Tenga en cuenta que la configuración de SUID/SGID/SVTX bits se establece automáticamente el correspondiente bit de ejecución. Sin esto, el permiso resultante no sería válida (ST caracteres).

Dejar respuesta

Please enter your comment!
Please enter your name here