Permisos en Linux — teoría con chmod en octal y en letras, umask y la carpeta de un trabajo en grupo (y el script que no quería arrancar)

Once de la noche, víspera de entregar la práctica de IC2. Laura, mi compañera de grupo, me pasa por el chat el script que compila todo. Lo guardo, lo lanzo y…

# La noche antes de la entrega: el script del grupo no arranca
cat > compilar.sh << 'EOF'
#!/bin/bash
echo "Compilando la práctica de IC2..."
EOF
./compilar.sh            # lo intento ejecutar... y Linux dice que no
ls -l compilar.sh        # la respuesta está en los diez primeros caracteres
chmod u+x compilar.sh    # u = el dueño (yo), + = añadir, x = ejecutar
ls -l compilar.sh        # ahora hay una x en el primer trío
./compilar.sh

Esto es lo que contestó la terminal:

$ cat > compilar.sh << 'EOF'
> #!/bin/bash
> echo "Compilando la práctica de IC2..."
> EOF
$ ./compilar.sh
bash: ./compilar.sh: Permission denied
$ ls -l compilar.sh
-rw-r--r-- 1 sergio sergio 53 Oct 25 16:49 compilar.sh
$ chmod u+x compilar.sh
$ ls -l compilar.sh
-rwxr--r-- 1 sergio sergio 53 Oct 25 16:49 compilar.sh
$ ./compilar.sh
Compilando la práctica de IC2...

Permission denied. Lo primero que pensé fue que el script estaba roto. Lo segundo, que Laura me había pasado otra versión. Estuve veinte minutos revisando un archivo de dos líneas que estaba perfecto, y casi acabo escribiendo chmod 777 «para que funcione ya». El problema estaba a la vista desde el principio: en -rw-r--r-- no hay ninguna x. El fichero se podía leer y escribir, pero nadie (ni yo, que era su dueño) tenía permiso para ejecutarlo. Un chmod u+x y listo: el mismo ls -l ya enseña -rwxr--r-- y el script arranca.

Hoy vamos a entender esos diez caracteres de verdad: quién es «el dueño», «el grupo» y «los otros», qué significan r, w y x (que en una carpeta no son lo mismo que en un fichero), cómo se cambian con chmod en octal (754) y en letras (u+x), por qué todo lo que creas nace con 644 o 755 (la umask), quién puede cambiar el dueño de un fichero y qué son esas s y t raras que a veces aparecen. Si vienes del artículo de llamadas al sistema en C, ya te sonará el 0644 que le pasábamos a open: hoy verás qué significa cada cifra. Y si la terminal aún te impone, repasa antes los comandos básicos de Linux. Después de la teoría tienes la práctica y los ejercicios.

El ejemplo que nos acompaña en los tres artículos es la carpeta de un trabajo en grupo de IC2: yo (sergio) soy el dueño, Laura y yo estamos en el grupo ic2, y Pablo, de otra clase, es «el resto del mundo».

Quién es quién: dueño, grupo y otros

Linux es un sistema multiusuario: en el mismo ordenador conviven varias cuentas y cada fichero tiene que saber quién puede hacer qué con él. Para no guardar una lista de permisos por persona, Linux simplifica y divide el mundo en tres clases:

  • Dueño (u, de user): el usuario al que pertenece el fichero. Normalmente, quien lo creó.
  • Grupo (g): un grupo de usuarios asociado al fichero. Todos sus miembros comparten unos mismos permisos.
  • Otros (o, de others): cualquier usuario que no sea el dueño ni esté en el grupo.

¿Y cómo sabes quién eres tú y en qué grupos estás? Con id:

id

En el ordenador de la práctica sale esto:

uid=1001(sergio) gid=1001(sergio) groups=1001(sergio),1010(ic2)

Se lee así: mi usuario es sergio (con el número 1001), mi grupo principal también se llama sergio y, además, pertenezco al grupo ic2, el del trabajo. Los números (uid, gid) son lo que Linux guarda de verdad; los nombres son para nosotros.

En casi todas las distribuciones, al crear un usuario se crea también un grupo con su mismo nombre del que solo él forma parte. Por eso, cuando creas un fichero, en ls -l suele salir sergio sergio: dueño sergio, grupo sergio. Para compartir de verdad hay que pasar el fichero a un grupo común, como ic2.

Una idea que conviene tener clara desde ya: cuando intentas abrir un fichero, Linux no suma los permisos de las tres clases. Mira una sola: si eres el dueño, usa el trío del dueño; si no lo eres pero estás en el grupo, el del grupo; y si no, el de otros. Lo comprobarás en la práctica con un resultado bastante sorprendente.

Leer los permisos con ls -l

Vamos a crear tres cosas distintas (un directorio, un fichero vacío y el script) y a mirarlas con ls -l:

# ¿Quién soy? Usuario, grupo principal y todos los grupos a los que pertenezco
id
mkdir docs                # un directorio
touch informe.txt         # un fichero vacío
cat > compilar.sh << 'EOF'
#!/bin/bash
echo "Compilando la práctica de IC2..."
EOF
ls -l                     # una línea por entrada: permisos, enlaces, dueño, grupo, tamaño, fecha, nombre

La salida real:

$ id
uid=1001(sergio) gid=1001(sergio) groups=1001(sergio),1010(ic2)
$ mkdir docs
$ touch informe.txt
$ cat > compilar.sh << 'EOF'
> #!/bin/bash
> echo "Compilando la práctica de IC2..."
> EOF
$ ls -l
total 8
-rw-r--r-- 1 sergio sergio   53 Oct 25 16:49 compilar.sh
drwxr-xr-x 2 sergio sergio 4096 Oct 25 16:49 docs
-rw-r--r-- 1 sergio sergio    0 Oct 25 16:49 informe.txt

Cada línea tiene siete columnas. El dibujo separa la del script pieza a pieza:

Anatomía de una línea de ls -l La línea de ls -l de compilar.sh partida en piezas: tipo, los tríos de dueño, grupo y otros, enlaces, dueño, grupo, tamaño en bytes, fecha y nombre. Anatomía de una línea de ls -l –rwxr––r–– 1 sergio sergio 53 Oct 25 16:49 compilar.sh tipo dueño (u) grupo (g) otros (o) enlaces dueño grupo bytes última modificación nombre r = leer (4) · w = escribir (2) · x = ejecutar (1) · – = no
Los diez primeros caracteres son el tipo y tres tríos: el violeta es para el dueño, el azul para el grupo y el coral para todos los demás.

Vamos por partes, fijándonos en el dibujo:

  1. El primer carácter es el tipo: - para un fichero normal, d para un directorio (docs) y l para un enlace simbólico.
  2. Los nueve siguientes son tres tríos de rwx: el del dueño, el del grupo y el de otros, en ese orden y siempre en ese orden. Cada posición tiene su letra fija (primero r, luego w, luego x); un - significa «este permiso no».
  3. El número que viene después es el de enlaces (para un directorio, cuenta también sus subdirectorios; hoy no nos importa).
  4. Dueño y grupo: sergio sergio.
  5. El tamaño en bytes: el script ocupa 53 bytes; docs ocupa 4096 porque un directorio reserva un bloque para su lista de nombres.
  6. La fecha de la última modificación y el nombre.

¿Qué significa cada letra en un fichero?

LetraEn un ficheroEjemplo
r (read)leer su contenidocat, less, abrirlo con open(…, O_RDONLY)
w (write)modificar su contenidoecho … >> fichero, guardarlo en un editor
x (execute)ejecutarlo como programa./compilar.sh, ./a.out

Ahora ya puedes leer la salida de arriba: compilar.sh e informe.txt tienen rw-r--r-- (yo leo y escribo; el grupo y los otros solo leen) y docs tiene rwxr-xr-x. ¿Por qué el directorio nace con x y los ficheros no? No es casualidad: lo decide la umask, que verás más abajo.

En tu ordenador saldrán tu usuario, tus grupos y tu fecha. Y si tu terminal está en español, la fecha puede salir como oct 25 en lugar de Oct 25. Las salidas de este artículo se generaron con el idioma de la terminal en inglés (LANG=C), que es lo que verás en casi todos los servidores.

Cambiar permisos con chmod en octal

chmod (change mode) cambia los permisos. La forma más rápida de usarlo es con tres cifras octales, una por trío. El truco es que cada letra tiene un peso:

  • r vale 4
  • w vale 2
  • x vale 1

Sumas los pesos de las letras que quieres y te sale una cifra entre 0 y 7. Como 4, 2 y 1 son potencias de dos, cada suma es única: 6 solo puede ser 4 + 2 (rw-) y 5 solo puede ser 4 + 1 (r-x). Por eso no hay ambigüedad.

touch compilar.sh entrega.txt notas.txt
chmod 754 compilar.sh     # 7 = 4+2+1 = rwx (yo) · 5 = 4+1 = r-x (grupo) · 4 = r-- (otros)
chmod 640 entrega.txt     # 6 = 4+2 = rw- · 4 = r-- · 0 = --- (otros no ven nada)
chmod 600 notas.txt       # solo yo leo y escribo
# %a = permisos en octal, %A = en letras, %n = nombre: las dos notaciones una al lado de la otra
stat -c '%a %A %n' compilar.sh entrega.txt notas.txt

Con stat -c '%a %A %n' vemos a la vez el número, las letras y el nombre:

$ touch compilar.sh entrega.txt notas.txt
$ chmod 754 compilar.sh
$ chmod 640 entrega.txt
$ chmod 600 notas.txt
$ stat -c '%a %A %n' compilar.sh entrega.txt notas.txt
754 -rwxr-xr-- compilar.sh
640 -rw-r----- entrega.txt
600 -rw------- notas.txt

El dibujo descompone el primero, 754, cifra a cifra:

chmod 754 en octal y en letras Las tres cifras de 754 descompuestas en bits: 7 = 4+2+1 = rwx para el dueño, 5 = 4+0+1 = r-x para el grupo y 4 = 4+0+0 = r– para otros. chmod 754: cada cifra es un trío dueño (u) r 4 w 2 x 1 4 + 2 + 1 = 7 rwx grupo (g) r 4 – 0 x 1 4 + 0 + 1 = 5 r-x otros (o) r 4 – 0 – 0 4 + 0 + 0 = 4 r– stat -c ‘%a %A’ → 754 -rwxr-xr–
Cada casilla encendida suma su peso (4, 2 o 1); la suma de cada trío es una cifra del número octal.

Comprobación a mano de los tres:

  • 754: 7 = 4 + 2 + 1 = rwx; 5 = 4 + 0 + 1 = r-x; 4 = 4 + 0 + 0 = r-- → rwxr-xr--.
  • 640: 6 = 4 + 2 = rw-; 4 = r--; 0 = --- → rw-r-----.
  • 600: 6 = rw-; 0 = ---; 0 = --- → rw-------.

Hay media docena de valores que vas a usar el 90 % de las veces:

OctalLetras¿Para qué?
755rwxr-xr-xscripts y programas que todos pueden usar; directorios normales
750rwxr-x---scripts o carpetas de un grupo de trabajo
700rwx------tu carpeta privada, tus scripts personales
644rw-r--r--ficheros normales que cualquiera puede leer
640rw-r-----documentos del grupo: el grupo lee, el resto no
600rw-------ficheros privados: claves, notas, configuraciones con contraseñas

Escribir chmod 777 «para que funcione ya». Funciona, sí: cualquier usuario del sistema puede ahora leer, modificar o borrar el contenido de tu fichero, y ejecutarlo. Si un script no arranca, lo que le falta es la x del dueño (chmod u+x o chmod 755), no todos los permisos del mundo.

Cambiar permisos en modo simbólico

La forma octal fija los nueve bits de golpe. A veces solo quieres tocar uno sin preocuparte del resto, y para eso está el modo simbólico, que se construye con tres piezas:

  1. ¿A quién? u (dueño), g (grupo), o (otros) o a (all, los tres). Se pueden juntar: ug, go…
  2. ¿Qué operación? + añade, - quita y = fija exactamente (lo que no nombres, se borra).
  3. ¿Qué permisos? r, w, x o una combinación.

Varias órdenes se separan con comas sin espacios: chmod u+x,g-w fichero.

touch entrega.txt
stat -c '%a %A %n' entrega.txt     # punto de partida
chmod g+w entrega.txt              # + añade: el grupo ya puede escribir
stat -c '%a %A %n' entrega.txt
chmod o-r entrega.txt              # - quita: otros ya no pueden leer
stat -c '%a %A %n' entrega.txt
chmod u=rw,g=r,o= entrega.txt      # = fija exactamente; 'o=' sin letras deja a otros sin nada
stat -c '%a %A %n' entrega.txt
chmod a+x entrega.txt              # a = all: u, g y o a la vez
stat -c '%a %A %n' entrega.txt

La salida real, paso a paso:

$ touch entrega.txt
$ stat -c '%a %A %n' entrega.txt
644 -rw-r--r-- entrega.txt
$ chmod g+w entrega.txt
$ stat -c '%a %A %n' entrega.txt
664 -rw-rw-r-- entrega.txt
$ chmod o-r entrega.txt
$ stat -c '%a %A %n' entrega.txt
660 -rw-rw---- entrega.txt
$ chmod u=rw,g=r,o= entrega.txt
$ stat -c '%a %A %n' entrega.txt
640 -rw-r----- entrega.txt
$ chmod a+x entrega.txt
$ stat -c '%a %A %n' entrega.txt
751 -rwxr-x--x entrega.txt

Esta es la traza de lo que hizo cada orden sobre entrega.txt:

OrdenAntesDespués¿Qué ha pasado?
(recién creado)—644 rw-r--r--lo decide la umask
chmod g+w644664 rw-rw-r--el grupo gana la w: 4 + 2 = 6
chmod o-r664660 rw-rw----otros pierden la r: 4 − 4 = 0
chmod u=rw,g=r,o=660640 rw-r-----= fija cada trío; o= sin letras lo deja vacío
chmod a+x640751 rwxr-x--xuna x más en cada trío: 6 + 1 = 7, 4 + 1 = 5, 0 + 1 = 1

Fíjate en la última fila: a+x solo añade, así que respeta lo que ya había. El grupo tenía r-- y se queda en r-x; otros no tenían nada y se quedan solo con x. Con el octal habrías tenido que calcular el número completo a mano.

¿Cuándo uso cada forma?

Quiero…MejorEjemplo
dejar un fichero con unos permisos exactosoctalchmod 640 entrega.txt
añadir o quitar un permiso sin tocar los demássimbólicochmod u+x compilar.sh
cambiar muchos ficheros que tienen permisos distintossimbólicochmod -R o-rwx carpeta
copiar los permisos que me dicen en un enunciado («ponlo a 750»)octalchmod 750 carpeta

Si escribes chmod +x script.sh sin decir a quién, se aplica a los tres tríos, igual que con a, pero respetando la umask (verás qué es en un momento). Con la umask normal, 022, da lo mismo que a+x. Es la forma más corta y habitual de hacer ejecutable un script.

Los permisos en los directorios

Aquí es donde se equivoca casi todo el mundo, porque las mismas tres letras significan otra cosa en un directorio. Un directorio no es más que una lista de nombres que apuntan a ficheros, así que:

LetraEn un ficheroEn un directorio
rleer el contenidoleer la lista de nombres (ls)
wmodificar el contenidocrear, borrar y renombrar entradas dentro (con x también)
xejecutarloentrar (cd) y acceder a lo que hay dentro por su nombre

Vamos a jugar con una carpeta privado y a quitarle y ponerle permisos a propósito:

mkdir privado
echo "tema 3: permisos" > privado/apuntes.txt
chmod 600 privado         # rw- en un DIRECTORIO: leer la lista y escribir en ella, pero SIN x
ls privado                # los nombres sí se ven (r)...
ls -l privado             # ...pero no los datos de cada fichero: hace falta x para entrar
cd privado                # y sin x tampoco se puede entrar
chmod 300 privado         # -wx: entrar sí, listar no
ls privado
cat privado/apuntes.txt   # si sabes el nombre exacto, puedes abrirlo
chmod 755 privado         # lo normal en un directorio: rwx para mí, r-x para el resto
ls -l privado

Lo que pasó de verdad:

$ mkdir privado
$ echo "tema 3: permisos" > privado/apuntes.txt
$ chmod 600 privado
$ ls privado
apuntes.txt
$ ls -l privado
ls: cannot access 'privado/apuntes.txt': Permission denied
total 0
-????????? ? ? ? ?            ? apuntes.txt
$ cd privado
bash: cd: privado: Permission denied
$ chmod 300 privado
$ ls privado
ls: cannot open directory 'privado': Permission denied
$ cat privado/apuntes.txt
tema 3: permisos
$ chmod 755 privado
$ ls -l privado
total 4
-rw-r--r-- 1 sergio sergio 17 Oct 25 16:49 apuntes.txt

Leámoslo por partes:

  • Con 600 (rw-, sin x), ls privado sí enseña el nombre apuntes.txt: para leer la lista basta con la r. Pero ls -l necesita además consultar los datos de cada fichero (permisos, tamaño, fecha), y para eso hay que entrar en el directorio, que es justo lo que da la x. Por eso sale -????????? con interrogaciones en todas las columnas. Y cd privado falla por lo mismo.
  • Con 300 (-wx, sin r) pasa justo lo contrario: no puedes listar (ls: cannot open directory), pero si sabes el nombre exacto del fichero, puedes llegar hasta él y abrirlo (cat privado/apuntes.txt funciona). Es como una habitación con la luz apagada: puedes entrar, pero no ves qué hay; si sabes dónde está el interruptor, lo encuentras.
  • Con 755 todo vuelve a la normalidad.

Pensar que, para borrar un fichero, hace falta permiso de escritura sobre el fichero. No: borrar es quitar un nombre de la lista del directorio, así que lo que cuenta es la w (y la x) de la carpeta. Puedes borrar un fichero r-------- si la carpeta es tuya y tiene w, y no puedes borrar un fichero rw-rw-rw- si la carpeta no te deja escribir.

Para un directorio, la regla práctica es: r y x van casi siempre juntas. Un directorio con r y sin x (como 644) es una trampa: ves los nombres pero no puedes hacer nada con ellos. Lo verás en los ejercicios.

umask: los permisos con los que nace todo

¿Por qué touch crea los ficheros con 644 y mkdir los directorios con 755? Porque los programas piden unos permisos «máximos» y el sistema les aplica una máscara, la umask, que apaga algunos bits:

  • touch, un editor o open(…, O_CREAT, 0666) piden 666 (rw-rw-rw-) para un fichero. Nunca piden x: un fichero de texto recién creado no tiene por qué ser ejecutable.
  • mkdir pide 777 (rwxrwxrwx) para un directorio, porque un directorio sin x no sirve para nada.
umask                     # la máscara actual, en octal
umask -S                  # la misma máscara, como permisos que SÍ se dejan
touch nuevo.txt
mkdir nueva-carpeta
stat -c '%a %A %n' nuevo.txt nueva-carpeta
umask 077                 # a partir de aquí, nada para el grupo ni para otros
touch secreto.txt
mkdir secreta
stat -c '%a %A %n' secreto.txt secreta

La salida real:

$ umask
0022
$ umask -S
u=rwx,g=rx,o=rx
$ touch nuevo.txt
$ mkdir nueva-carpeta
$ stat -c '%a %A %n' nuevo.txt nueva-carpeta
644 -rw-r--r-- nuevo.txt
755 drwxr-xr-x nueva-carpeta
$ umask 077
$ touch secreto.txt
$ mkdir secreta
$ stat -c '%a %A %n' secreto.txt secreta
600 -rw------- secreto.txt
700 drwx------ secreta

umask muestra 0022 (el primer 0 es el de los bits especiales, que verás al final) y umask -S lo enseña al revés: como los permisos que sí deja pasar (u=rwx,g=rx,o=rx). El dibujo explica de dónde sale el 644:

Cómo la umask 022 da 644 y 755 Un fichero nuevo parte de 666 y un directorio de 777; la umask 022 apaga la w del grupo y la de otros, y quedan 644 (rw-r–r–) y 755 (rwxr-xr-x). umask 022: la máscara apaga bits Fichero nuevo (touch) base 666 rw–rw–rw– umask 022 ––––w––w– = 644 rw–r––r–– las w del grupo y de otros, fuera Directorio nuevo (mkdir) base 777 rwxrwxrwx umask 022 ––––w––w– = 755 rwxr–xr–x las w del grupo y de otros, fuera
Las casillas coral de la umask son las que se apagan en el resultado: no es una resta, es una máscara.

Las cuentas, bit a bit:

  • Fichero: 666 = rw-rw-rw-. La máscara 022 = ----w--w- apaga la w del grupo y la de otros. Queda rw-r--r-- = 644.
  • Directorio: 777 = rwxrwxrwx, menos las mismas dos w = rwxr-xr-x = 755.
  • Con umask 077 se apaga todo lo del grupo y de otros: el fichero queda rw------- (600) y el directorio rwx------ (700).

Leer la umask como «los permisos que tendrán los ficheros». Es al revés: dice lo que se quita. Si escribes umask 644 pensando en ficheros 644, lo que consigues son ficheros 022 (-----w--w-) que ni tú puedes leer. Lo verás en directo en los ejercicios.

Técnicamente no es una resta, es una operación de bits: permisos = pedido AND NOT máscara. Casi siempre da lo mismo que restar cifra a cifra, pero no siempre. Con umask 033 y un fichero: 6 − 3 = 3 haría pensar en 633, pero 666 no tiene x que quitar, así que el resultado es 644. Piensa siempre en casillas que se apagan, como en el dibujo.

¿Te acuerdas del 0644 del artículo de llamadas al sistema? Ese tercer argumento de open también pasa por la umask: el fichero se crea con 0644 & ~umask. Con la umask 022 de siempre se queda en 0644; con 077 saldría 0600. Y la umask que ves aquí solo afecta a la terminal donde la cambias: si quieres que sea permanente, la orden umask 027 va en tu ~/.bashrc.

Dueño y grupo: chown y chgrp

Los permisos dicen qué puede hacer cada clase, pero ¿quién es el dueño y cuál es el grupo? Eso se cambia con dos órdenes:

  • chgrp grupo fichero cambia el grupo.
  • chown usuario fichero cambia el dueño (y chown usuario:grupo fichero, los dos a la vez).
touch entrega.txt
ls -l entrega.txt          # recién creado: dueño sergio, grupo sergio
chgrp ic2 entrega.txt      # soy del grupo ic2, así que puedo darle el fichero a ese grupo
ls -l entrega.txt
chown laura entrega.txt    # pero regalárselo a otra persona solo lo puede hacer root

La salida real:

$ touch entrega.txt
$ ls -l entrega.txt
-rw-r--r-- 1 sergio sergio 0 Oct 25 16:49 entrega.txt
$ chgrp ic2 entrega.txt
$ ls -l entrega.txt
-rw-r--r-- 1 sergio ic2 0 Oct 25 16:49 entrega.txt
$ chown laura entrega.txt
chown: changing ownership of 'entrega.txt': Operation not permitted

El chgrp funciona porque soy el dueño del fichero y pertenezco al grupo ic2: un usuario normal puede pasar sus ficheros a cualquiera de sus grupos. Pero el chown falla con Operation not permitted. ¿Por qué no puedo regalarle mi fichero a Laura? Porque, si se pudiera, cualquiera podría «colocarle» ficheros a otra persona (por ejemplo, para gastar su cuota de disco o para hacer pasar algo como suyo). Por eso solo root puede cambiar el dueño. Con permisos de administrador sería sudo chown laura entrega.txt; esa orden no la he ejecutado aquí porque el usuario de la práctica no tiene sudo.

Las dos órdenes aceptan -R para aplicarse a una carpeta entera y todo lo que contiene: chgrp -R ic2 practica-ic2. Lo usarás en la práctica para montar la carpeta del grupo.

Los bits especiales: setuid, setgid y sticky

Hay tres permisos más que no caben en rwx y que se guardan en una cuarta cifra octal, la de delante:

BitValorDónde se veQué hace
setuid4s en la x del dueñoel programa se ejecuta con los permisos de su dueño, no de quien lo lanza
setgid2s en la x del grupoen una carpeta: lo que se cree dentro hereda el grupo de la carpeta
sticky1t en la x de otrosen una carpeta: cada usuario solo puede borrar lo suyo
ls -l /usr/bin/passwd      # setuid: una s donde iría la x del dueño
ls -ld /tmp                # sticky: una t donde iría la x de otros
touch lanzar.sh
chmod 4755 lanzar.sh       # 4 = setuid delante de 755
mkdir comun grupo
chmod 1777 comun           # 1 = sticky: todos escriben, cada uno solo borra lo suyo
chmod 2770 grupo           # 2 = setgid: lo que se cree dentro hereda el grupo de la carpeta
stat -c '%a %A %n' lanzar.sh comun grupo

La salida real:

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 64152 May 30  2024 /usr/bin/passwd
$ ls -ld /tmp
drwxrwxrwt 10 root root 4096 Oct 25 16:49 /tmp
$ touch lanzar.sh
$ chmod 4755 lanzar.sh
$ mkdir comun grupo
$ chmod 1777 comun
$ chmod 2770 grupo
$ stat -c '%a %A %n' lanzar.sh comun grupo
4755 -rwsr-xr-x lanzar.sh
1777 drwxrwxrwt comun
2770 drwxrws--- grupo
  • /usr/bin/passwd tiene rwsr-xr-x. Este es el ejemplo clásico de tus apuntes: para cambiar tu contraseña, passwd tiene que escribir en /etc/shadow, que solo puede tocar root. Gracias al setuid, mientras se ejecuta, el proceso tiene como usuario efectivo (el EUID de la práctica de procesos) al dueño del programa, root, aunque lo hayas lanzado tú.
  • /tmp tiene rwxrwxrwt: todo el mundo puede escribir, pero la t impide que borres los ficheros temporales de otra persona.
  • En lanzar.sh, comun y grupo ves los tres bits puestos por nosotros: 4755, 1777 y 2770. La cuarta cifra se suma igual que las otras: 4 + 2 = 6 sería setuid y setgid a la vez.

Un detalle de las letras: la s o la t minúscula significa que debajo también está la x; si sale en mayúscula (S o T), el bit especial está puesto pero la x no. Lo verás en el nivel 3 de los ejercicios, con una carpeta drwxrws--T.

Linux ignora el setuid en los scripts (.sh): solo funciona en programas compilados. Es una medida de seguridad, porque un script con setuid de root sería muy fácil de engañar. Así que lanzar.sh muestra la s, pero no ganaría ningún permiso. El bit que de verdad vas a usar en tus trabajos es el setgid en carpetas compartidas.

Errores típicos

Confundir el orden de los tríos. Siempre es dueño, grupo, otros. chmod 466 no es «yo leo y escribo, el resto lee»: es r--rw-rw-, y tú, el dueño, te quedas sin poder escribir.

Pensar que o es owner (dueño). o es others; el dueño es u. chmod o-r le quita la lectura a todos los demás, no a ti.

Hacer chmod -R 644 carpeta «para que todos lean». También les quita la x a las carpetas de dentro y ya no se puede entrar en ellas. Para eso existe la X mayúscula (la verás en los ejercicios).

Probar los permisos siendo root (o con sudo). Root se los salta casi todos, así que «a mí me funciona» no significa nada. Prueba siempre con un usuario normal.

Pruébalo en tu terminal

Aquí no hay Python Tutor: el «paso a paso» lo hace tu propia terminal. Abre una (en Linux, en WSL o en la máquina virtual de prácticas), crea una carpeta para no tocar nada importante (mkdir ~/prueba-permisos && cd ~/prueba-permisos) y teclea las órdenes que van detrás de cada $. Esto es lo que deberías ver:

$ touch prueba.txt
$ stat -c '%a %A %n' prueba.txt
644 -rw-r--r-- prueba.txt
$ chmod 600 prueba.txt
$ stat -c '%a %A %n' prueba.txt
600 -rw------- prueba.txt
$ chmod u+x,g+r prueba.txt
$ stat -c '%a %A %n' prueba.txt
740 -rwxr----- prueba.txt
$ umask
0022

Qué observar en cada paso:

  1. El primer stat: el fichero nace con 644. Si te sale otra cosa, tu umask no es 022 (compruébalo al final con umask).
  2. Tras chmod 600: el grupo y los otros se quedan con ---. Cuenta: 6 = 4 + 2 = rw-, y dos ceros.
  3. Tras chmod u+x,g+r: dos cambios en una sola orden, separados por una coma y sin espacios. El dueño pasa de 6 a 7 (6 + 1) y el grupo de 0 a 4. Resultado: 740.
  4. umask: la máscara que explica el 644 del principio.

Si te atreves, añade un paso: chmod 000 prueba.txt y después cat prueba.txt. ¿Qué crees que pasará siendo tú el dueño?

Resumen

ConceptoEn una líneaEjemplo
Tres clasesdueño (u), grupo (g) y otros (o); Linux mira solo la que te correspondeid para ver tus grupos
Diez caracterestipo + tres tríos rwxdrwxr-x---
Octalr = 4, w = 2, x = 1; una cifra por tríochmod 640 entrega.txt
Simbólicoa quién + operación + permisoschmod u+x,g-w compilar.sh
Directoriosr = listar, w = crear y borrar, x = entrarchmod 750 carpeta
umasklo que se apaga al crear: 666 y 777 menos la máscaraumask 022 → 644 y 755
chown / chgrpdueño solo con root; grupo, a uno de los tuyoschgrp ic2 entrega.txt
Bits especialessetuid 4, setgid 2, sticky 1 en la cifra de delantechmod 2770 carpeta

Tres ideas para llevarte

  1. Diez caracteres, cuatro piezas: tipo, dueño, grupo y otros. Linux mira solo el trío que te toca, en ese orden.
  2. En una carpeta, la x es la llave de la puerta. Sin ella no entras, aunque veas los nombres.
  3. La umask resta, no suma: dice qué permisos se quitan a todo lo que nace.

Con esto ya puedes leer y cambiar los permisos de cualquier cosa. En la práctica montaremos la carpeta del trabajo en grupo con permisos de verdad y la pondremos a prueba con tres usuarios: Laura, Pablo y yo. Y en el siguiente tema de Linux saldremos de los permisos para ver el shell avanzado: redirecciones, tuberías y cómo encadenar órdenes.

Siguiente paso: prácticaPermisos en Linux — práctica con la carpeta de un trabajo en grupo, tres usuarios y un revisor de permisos (y la compañera que no podía compilar)

¿Te ha servido este artículo? Así puedes apoyar SergioLearns →

Sigue aprendiendo

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *