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
ryxpara ejecutarse con./script.sh. Con soloxfalla, 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 dentrox: entrar (cd) y acceder a lo que contiene
- Para borrar un archivo importa el permiso
wdel directorio, no el del archivo. chmod -Raplica el cambio recursivamente. Hay que usarlo con cuidado:chmod -R 755hace 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
/tmptodos 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 unas).