Cómo funcionan los permisos de archivo en Unix: leer 755 sin adivinar
Publicado el 24/4/2026 · 7 min de lectura · Herramientas para desarrolladores
Daniel Okonkwo — Desarrollador front-end y redactor de Tecnología en OneKitly
Rendimiento web · Formatos de archivo
Verificado con 2 fuentes
Un modo de permisos Unix son tres dígitos octales: uno para el propietario del archivo, uno para su grupo y uno para todos los demás. Dentro de un dígito, la lectura vale 4, la escritura 2 y la ejecución 1, y se suman: 7 es rwx, 6 es rw-, 5 es r-x, 4 es r--. Así que 755 es rwxr-xr-x: el propietario puede leer, escribir y ejecutar, y el resto puede leer y ejecutar. En un archivo normal el bit de ejecución permite al núcleo lanzarlo. En un directorio significa otra cosa por completo: concede el derecho a atravesar el directorio, es decir, a alcanzar una entrada por su nombre. La lectura en un directorio solo permite listar los nombres; sin el bit de ejecución no puedes abrir, consultar ni entrar en ninguna. Un cuarto dígito opcional al frente lleva setuid (4000), setgid (2000) y el sticky bit (1000), por eso /tmp es 1777.
Lectura 4, escritura 2, ejecución 1, y cada uno de los tres dígitos describe a una parte distinta. Lo que casi todas las explicaciones fallan es qué hace el bit de ejecución en un directorio: concede el paso, no el derecho a ejecutar nada.
Tres dígitos, tres partes, y solo una se aplica
En la salida de `ls -l` el primer carácter indica el tipo — un guion para un archivo normal, d para un directorio, l para un enlace simbólico — y los nueve siguientes son tres grupos de tres: propietario, grupo, otros. Lo que sorprende es que no se acumulan. El núcleo escoge la primera clase a la que perteneces y se detiene ahí. Si eres el propietario de un archivo en 477 obtienes r-- y nada más, aunque los bits de grupo y otros estén abiertos de par en par: la clase propietario coincidió primero y el resto no se consulta nunca.
Hay dos formas de escribir un cambio y no son equivalentes. El octal es absoluto: `chmod 644 notes.txt` fija el modo entero y borra lo que hubiera antes. El simbólico es relativo: `chmod u+x script.sh` añade un bit y deja los otros ocho intactos. En un script de despliegue casi siempre quieres la forma octal, porque produce el mismo estado final sea cual sea el aspecto del archivo al llegar.
En un directorio, el bit de ejecución es un derecho completamente distinto
Nada se ejecuta nunca por dar el bit x a un directorio. En un directorio ese bit es permiso de búsqueda: deja que un proceso resuelva un nombre dentro y alcance lo que hay detrás. La separación se ve fácil. Pon un directorio en 400 y `ls` imprimirá encantado los nombres que contiene, pero cada consulta falla y `cat dir/archivo` se rechaza: ves las etiquetas y no tocas nada. Ponlo en 100 y ocurre lo contrario: no puedes listar nada, pero si ya conoces la ruta exacta abres el archivo. Esa asimetría explica que un directorio personal en 711 funcione: otros alcanzan ~/public_html sin poder enumerar el resto.
La misma lógica explica un resultado que parece un fallo. Borrar un archivo no es una modificación del archivo: es una modificación del directorio que lo lista. Así que el permiso que decide si un archivo puede eliminarse es escritura más ejecución sobre el directorio que lo contiene, y el modo del propio archivo es irrelevante. Un archivo en 444 dentro de un directorio en 777 puede borrarlo cualquiera de la máquina. Ese es justo el agujero que el sticky bit vino a tapar, y por eso /tmp es 1777 y no 0777.
El cuarto dígito y por qué umask no es un permiso
Tres bits especiales viven en un dígito inicial opcional. Setuid es 4000: en un binario ejecutable lo hace correr con la identidad del propietario, que es como passwd edita un archivo que tú no puedes. En Linux se ignora en silencio en los scripts interpretados y no significa nada en un directorio. Setgid es 2000: en un binario hace lo mismo con el grupo, y en un directorio hace algo mucho más útil — las entradas nuevas heredan el grupo del directorio en vez del de quien las crea, y los subdirectorios nuevos heredan también el bit setgid, que es la forma estándar de mantener coherente un árbol de proyecto compartido. El sticky es 1000: en un directorio limita borrar y renombrar una entrada al propietario de la entrada, al del directorio o a root.
El umask es la pieza que más se invierte. No es el permiso que reciben los archivos nuevos: es una máscara de bits que se quitan de lo que pidió el programa que los crea. Los programas piden 666 para un archivo y 777 para un directorio, y cada bit puesto en el umask se apaga. Con el umask habitual 022 obtienes por tanto 644 para archivos y 755 para directorios. Y borra en vez de restar: umask 023 sigue dando 644 en un archivo nuevo, no 643, porque el archivo nunca pidió el bit de ejecución y no hay nada que quitar. Un pariente cercano: `chmod +x` sin letra de clase no equivale a `chmod a+x`, porque la forma escueta también respeta tu umask — bajo umask 077 concede la ejecución solo al propietario.
| Dígito | Simbólico | En un archivo | En un directorio |
|---|---|---|---|
| 0 | --- | Ningún acceso | Ningún acceso |
| 1 | --x | El núcleo puede lanzarlo | Solo paso: alcanzar una entrada cuyo nombre exacto ya conoces, sin poder listar el contenido |
| 2 | -w- | Puede modificarse o truncarse | Inútil por sí solo: crear o borrar una entrada exige también el bit de ejecución |
| 3 | -wx | Modificar y ejecutar, pero no leer | Crear, borrar y renombrar entradas sin poder listarlas: un buzón de depósito |
| 4 | r-- | Puede leerse | Listar solo los nombres: cualquier intento de consultar o abrir una entrada se rechaza |
| 5 | r-x | Leer y ejecutar | Listar y atravesar: el ajuste normal de un directorio que otros deben recorrer |
| 6 | rw- | Leer y modificar: el valor por defecto de un archivo nuevo | Listar los nombres, no alcanzar nada y tampoco crear nada: escritura sin ejecución es peso muerto |
| 7 | rwx | Leer, modificar y ejecutar | Control total: listar, atravesar, crear, renombrar y borrar entradas |
Preguntas frecuentes
- ¿Por qué chmod 777 es la solución equivocada?
- Da acceso de escritura a todas las cuentas de la máquina, incluida la identidad bajo la que corre tu servidor web o un proceso comprometido, y el código escribible por todos es código que cualquiera puede sustituir. Además suele errar la causa real, que más a menudo es una propiedad equivocada o un bit de ejecución ausente en un directorio padre que un permiso demasiado estrecho. Algunos programas se niegan de plano: OpenSSH ignora una clave privada o un authorized_keys escribible por el grupo o por todos.
- ¿chmod 755 hace que un script se pueda ejecutar?
- Concede permiso para intentarlo, que no es lo mismo que hacer que funcione. Un archivo de texto necesita además una línea shebang que nombre un intérprete existente, o el núcleo no tiene a quién entregárselo. Otras dos cosas se imponen por completo sobre el modo: un sistema de archivos montado con la opción noexec se niega a ejecutar nada, digan lo que digan los bits, y cada directorio del camino hasta el archivo necesita su propio bit de ejecución para que el archivo sea siquiera alcanzable.
- ¿Por qué alguien puede borrar un archivo que puse en solo lectura?
- Porque el borrado es un cambio en el directorio, no en el archivo. El núcleo comprueba escritura y ejecución sobre el directorio que guarda el nombre y nunca mira el modo del archivo. Para impedirlo, estrecha el directorio o ponle el sticky bit, que limita borrar y renombrar al propietario de la entrada, al del directorio y a root — la razón de que un /tmp compartido sea 1777.
Artículos que podrían interesarte
Todas las guías →Herramientas relacionadas
Fuentes
¿Has detectado un error en este artículo?