Explorador
Chuleta

Permisos de archivos

Cómo leer ls -l, usar chmod en modo simbólico y numérico, cambiar dueño y grupo, y entender umask y los bits especiales.

Actualizado el

En esta guía

Leer los permisos

ls -l hola.sh
-rw-r--r-- 1 usuario usuario 85 Oct  3 10:00 hola.sh
 -   rw-   r--   r--
 │    │     │     │
 │    │     │     └── otros (others):  solo lectura
 │    │     └──────── grupo (group):   solo lectura
 │    └────────────── dueño (owner):   lectura y escritura
 └─────────────────── tipo: "-" archivo, "d" directorio
Letra Significa Valor numérico
r read (leer) 4
w write (escribir) 2
x execute (ejecutar) 1

Las columnas 3 y 4 de ls -l son el dueño y el grupo del archivo.

Modo numérico

Un dígito por cada categoría (dueño, grupo, otros). Cada dígito es la suma de r=4, w=2, x=1.

Modo Permisos Uso típico
755 rwxr-xr-x Scripts y programas públicos
750 rwxr-x--- Dueño todo, el grupo lee y ejecuta, otros nada
740 rwxr----- Dueño todo, el grupo solo lee, otros nada
700 rwx------ Solo el dueño lee, escribe y ejecuta. Carpetas privadas
644 rw-r--r-- Archivos normales
600 rw------- Archivos privados, como llaves SSH
chmod 755 hola.sh

Modo simbólico

La forma es chmod [quién][operador][permisos].

Quién Significa
u user (dueño)
g group (grupo)
o others (otros)
a all (todos)
Operador Significa
+ Agrega el permiso
- Quita el permiso
= Fija exactamente esos permisos
chmod +x hola.sh             # agrega ejecución a todos
chmod go-rwx hola.sh         # quita todo a grupo y otros (queda -rwx------)
chmod g-x hola.sh            # solo quita ejecución al grupo
chmod u+x,g+r hola.sh        # varios cambios a la vez
chmod u=rwx,g=r,o= hola.sh   # fija exacto: dueño rwx, grupo r, otros nada

Detalles que suelen confundir

  • Un script con shebang necesita r y x para ejecutarse con ./script.sh. Con solo x falla, porque el intérprete tiene que leer el archivo.
  • En directorios los permisos significan otra cosa:
    • r: listar el contenido (ls)
    • w: crear, borrar o renombrar archivos dentro
    • x: entrar (cd) y acceder a lo que contiene
  • Para borrar un archivo importa el permiso w del directorio, no el del archivo.
  • chmod -R aplica el cambio recursivamente. Hay que usarlo con cuidado: chmod -R 755 hace ejecutables también los archivos de texto.

Dueño y grupo

id                                   # usuario y grupos propios
groups                               # solo los grupos
sudo chown otrouser hola.sh          # cambia el dueño
sudo chgrp equipo hola.sh            # cambia el grupo
sudo chown otrouser:equipo hola.sh   # ambos a la vez

Probar los permisos con otro usuario

sudo useradd -m -s /bin/bash alumno
mkdir /tmp/demo && cp hola.sh /tmp/demo/

chmod 755 /tmp/demo/hola.sh
sudo -u alumno /tmp/demo/hola.sh     # funciona

chmod 700 /tmp/demo/hola.sh
sudo -u alumno /tmp/demo/hola.sh     # Permission denied

sudo groupadd equipo
sudo usermod -aG equipo alumno
sudo chgrp equipo /tmp/demo/hola.sh
chmod 750 /tmp/demo/hola.sh
sudo -u alumno /tmp/demo/hola.sh     # funciona, por el grupo

sudo userdel -r alumno && sudo groupdel equipo && rm -rf /tmp/demo

La prueba va en /tmp porque en Ubuntu reciente la carpeta /home/usuario suele ser 750, y el otro usuario no podría ni entrar.

umask: permisos de los archivos nuevos

umask               # normalmente 0022

El umask quita permisos a los valores base (666 para archivos, 777 para directorios). Con 022, los archivos nacen 644 y los directorios 755. Por eso un script recién creado no tiene x: los archivos nunca nacen ejecutables.

umask 077                                 # en esta sesión, todo lo nuevo será privado
touch privado.txt && ls -l privado.txt    # -rw-------

Bits especiales

ls -ld /tmp         # drwxrwxrwt, la "t" es el sticky bit
  • Sticky bit: en /tmp todos pueden escribir, pero solo el dueño de cada archivo puede borrarlo.
  • setuid: hace que un programa corra con los permisos de su dueño. Es lo que usa sudo (ls -l $(which sudo) muestra una s).