Permisos en Linux — ejercicios con chmod, umask y una carpeta de entregas compartida (y el chmod -R que me dejó fuera de mi propia carpeta)

Tenía una carpeta datos/ con las medidas de una práctica y quería que mis compañeros pudieran leerlas. Me acordé de que «644 es lectura para todos» y escribí, muy seguro, chmod -R 644 datos. La terminal se quejó (cannot access 'datos/medidas.csv') y, cuando fui a comprobarlo, ni yo mismo podía entrar: cd datos → Permission denied. Había dejado mi propia carpeta sin la x. La solución era una sola letra, una X mayúscula, y la verás en el fragmento 2 de «¿Qué falla aquí?».

En estos ejercicios ya no te doy las órdenes hechas: tú decides los números, las letras y la máscara. Si necesitas repasar, tienes la teoría y la práctica de permisos en Linux, y al final, el chuletario con todo en una página.

Cómo usar este artículo

  1. Lee el enunciado y escribe las órdenes en un papel o en un fichero antes de probarlas.
  2. Pruébalas en una carpeta de pruebas (mkdir ~/ejercicios-permisos && cd ~/ejercicios-permisos), nunca en tu carpeta personal ni como root.
  3. Compara con la salida esperada. Si no coincide, mira la pista antes que la solución.
  4. Lee la solución aunque te haya salido: cada una explica por qué está hecha así y qué habría fallado con la alternativa obvia.

Nivel 1 (básico): tres permisos, dos notaciones

En una carpeta de pruebas, crea los ficheros vacíos informe.txt y compilar.sh y el directorio datos. Después:

  • informe.txt: que yo lo lea y lo escriba, que el grupo solo lo lea y que otros no puedan nada. En octal.
  • compilar.sh: que yo lo lea, lo escriba y lo ejecute, que el grupo lo lea y lo ejecute y que otros no puedan nada. En modo simbólico, partiendo de los permisos con los que nace.
  • datos: que el grupo pueda entrar y ver qué hay, pero no crear ni borrar nada; otros, fuera. En octal.

Termina con un stat que muestre los tres en octal y en letras. Salida esperada del stat:

640 -rw-r----- informe.txt
750 -rwxr-x--- compilar.sh
750 drwxr-x--- datos

compilar.sh nace con 644 (rw-r--r--). Compara letra a letra con rwxr-x---: hay dos x que añadir y una r que quitar. Se puede hacer en una sola orden con comas.

Nivel 2 (intermedio): la umask del grupo

Quieres que todo lo que crees a partir de ahora en tu terminal salga así: ficheros 640 y directorios 750. Elige la umask, ponla, muéstrala en octal y en letras, y compruébalo creando un fichero acta.txt y una carpeta capturas. Salida esperada (sin las órdenes):

0027
u=rwx,g=rx,o=
640 -rw-r----- acta.txt
750 drwxr-x--- capturas

Piensa qué bits hay que apagar en 666 para llegar a 640, y comprueba que esos mismos bits llevan 777 a 750. La umask es lo que se quita, no lo que queda.

Nivel 3 (desafío): la carpeta de entregas

El grupo ic2 necesita una carpeta entregas donde cada uno deje su fichero. Requisitos:

  1. El dueño (sergio) y el grupo pueden entrar, listar y crear; otros, nada.
  2. Todo lo que se cree dentro tiene que pertenecer al grupo ic2, lo cree quien lo cree.
  3. Nadie puede borrar los ficheros de otra persona, aunque todos puedan escribir en la carpeta.

Créala como sergio, deja dentro sergio.txt, y comprueba desde la terminal de Laura que su laura.txt sale con grupo ic2, que no puede borrar sergio.txt y que sí puede borrar el suyo. Por último, comprueba que Pablo no puede listar la carpeta. Lo que tienes que ver:

drwxrws--T 2 sergio ic2 4096 Oct 25 16:49 entregas
-rw-r--r-- 1 laura  ic2 0 Oct 25 16:49 laura.txt
-rw-r--r-- 1 sergio ic2 0 Oct 25 16:49 sergio.txt
rm: cannot remove 'entregas/sergio.txt': Operation not permitted
ls: cannot open directory 'entregas': Permission denied

Los requisitos 2 y 3 son dos bits especiales. Busca en la tabla de la teoría cuál hace que se herede el grupo y cuál impide borrar lo ajeno, y súmalos en la cifra de delante. (Para el apartado de Laura y Pablo necesitas los usuarios de prueba de la práctica.)

¿Qué falla aquí?

Tres fragmentos con un error que se comete de verdad. Para cada uno: lee el código, predice qué pasará y después mira la explicación.

Fragmento 1: «yo leo y escribo, los demás leen»

touch informe.txt
chmod 466 informe.txt               # "yo leo y escribo, los demás leen"... ¿seguro?
echo "Conclusiones" >> informe.txt
stat -c '%a %A %n' informe.txt

¿Se añade la línea «Conclusiones» al informe?

Esto es lo que pasa:

$ touch informe.txt
$ chmod 466 informe.txt
$ echo "Conclusiones" >> informe.txt
bash: informe.txt: Permission denied
$ stat -c '%a %A %n' informe.txt
466 -r--rw-rw- informe.txt

El stat lo explica: 466 es r--rw-rw-. El primer dígito siempre es el dueño, así que el dueño (yo) se ha quedado con r--, sin w, y el grupo y los otros tienen rw-. Y no, no me salva estar en el grupo: como soy el dueño, Linux solo mira el primer trío. La intención era «yo 6, los demás 4», es decir, 644, pero se escribió con las cifras al revés.

Escribir el octal empezando por «los demás». El orden es fijo: dueño, grupo, otros. Léelo siempre en voz alta antes de pulsar Intro: «seis para mí, cuatro para el grupo, cuatro para otros».

El arreglo:

touch informe.txt
chmod 644 informe.txt               # el primer dígito es SIEMPRE el dueño: 6 = rw-
echo "Conclusiones" >> informe.txt
stat -c '%a %A %n' informe.txt

Y su salida, sin errores y con los permisos que queríamos:

$ touch informe.txt
$ chmod 644 informe.txt
$ echo "Conclusiones" >> informe.txt
$ stat -c '%a %A %n' informe.txt
644 -rw-r--r-- informe.txt

Si dudas del orden, usa el simbólico, que dice a quién va cada cosa: chmod u=rw,go=r informe.txt da 644 sin pensar en posiciones.

Fragmento 2: «que todo el mundo pueda leer»

mkdir datos
touch datos/medidas.csv
chmod -R 644 datos                  # "que todo el mundo pueda leer"
ls -l datos
cd datos

¿Podrás ver la carpeta con ls -l y entrar con cd?

Esto es lo que pasa:

$ mkdir datos
$ touch datos/medidas.csv
$ chmod -R 644 datos
chmod: cannot access 'datos/medidas.csv': Permission denied
$ ls -l datos
ls: cannot access 'datos/medidas.csv': Permission denied
total 0
-????????? ? ? ? ?            ? medidas.csv
$ cd datos
bash: cd: datos: Permission denied

Hay tres errores y los tres tienen la misma causa. chmod -R aplica 644 primero a la carpeta datos y después intenta bajar a lo que tiene dentro… pero la carpeta ya no tiene x, así que ni siquiera puede llegar a medidas.csv (primer error). ls -l puede leer el nombre (r) pero no consultar el fichero (x), y por eso sale -?????????. Y cd necesita la x. El dibujo pone las dos situaciones una al lado de la otra:

La x de un directorio Con 644 el directorio deja leer los nombres (r) pero no entrar ni consultar los ficheros (falta x): ls -l muestra signos de interrogación y cd falla. Con 755 todo funciona. Un directorio con 644 frente a uno con 755 datos/ 644 drw-r–r– r leer la lista de nombres   x entrar y mirar cada fichero   cd datos → Permission denied   lo que ve ls -l: -????????? ? ? ? ? ? medidas.csv datos/ 755 drwxr-xr-x r leer la lista de nombres   x entrar y mirar cada fichero   cd datos → entra sin errores   lo que ve ls -l: -rw-r–r– … medidas.csv
En un directorio, r da los nombres y x da el paso: sin x, ls -l solo puede enseñar interrogaciones.

Usar chmod -R con un número cuando dentro hay carpetas y ficheros. Un número no distingue entre «entrar» y «ejecutar»: o les quitas la x a las carpetas, o se la das a todos los ficheros.

El arreglo usa la X mayúscula:

mkdir datos
touch datos/medidas.csv
chmod -R u=rwX,go=rX datos          # X mayúscula: x solo en directorios (y en lo que ya era ejecutable)
stat -c '%a %A %n' datos datos/medidas.csv
cd datos

La salida, con la carpeta en 755, el fichero en 644 y el cd sin errores:

$ mkdir datos
$ touch datos/medidas.csv
$ chmod -R u=rwX,go=rX datos
$ stat -c '%a %A %n' datos datos/medidas.csv
755 drwxr-xr-x datos
644 -rw-r--r-- datos/medidas.csv
$ cd datos

X significa «pon la x solo a los directorios (y a lo que ya era ejecutable para alguien)». Así, u=rwX,go=rX da rwx r-x r-x (755) a la carpeta y rw- r-- r-- (644) al fichero en una sola orden.

chmod -R u=rwX,go=rX carpeta es la receta para «que todos puedan leer esta carpeta entera» sin romper nada. Apúntala en el chuletario.

Fragmento 3: «quiero que mis ficheros salgan 644»

umask 644                           # "quiero que mis ficheros salgan 644"
touch nuevo.txt
stat -c '%a %A %n' nuevo.txt
cat nuevo.txt

¿Con qué permisos nacerá nuevo.txt?

Esto es lo que pasa:

$ umask 644
$ touch nuevo.txt
$ stat -c '%a %A %n' nuevo.txt
22 -----w--w- nuevo.txt
$ cat nuevo.txt
cat: nuevo.txt: Permission denied

La umask es lo que se quita, no lo que queda. 666 sin rw-r--r-- (644) deja solo ----w--w-, es decir, 022 (stat lo escribe 22, sin el cero de delante). El fichero nace sin r para el dueño, y por eso ni yo puedo hacer cat. Justo lo contrario de lo que quería.

Poner en la umask los permisos que quieres. Para conseguir 644, la umask es lo que le falta a 666 para llegar ahí: 6 − 6 = 0, 6 − 4 = 2, 6 − 4 = 2 → 022.

El arreglo:

umask 022                           # la máscara dice lo que se QUITA: 666 sin 022 = 644
touch nuevo.txt
stat -c '%a %A %n' nuevo.txt
cat nuevo.txt

Y ahora el fichero nace con 644 y se puede leer (vacío, así que cat no imprime nada):

$ umask 022
$ touch nuevo.txt
$ stat -c '%a %A %n' nuevo.txt
644 -rw-r--r-- nuevo.txt
$ cat nuevo.txt

Si alguna vez la lías con la umask en una terminal, no pasa nada: solo afecta a esa terminal. Ciérrala y abre otra, o escribe umask 022.

Soluciones

Solución del nivel 1

touch informe.txt compilar.sh
mkdir datos
chmod 640 informe.txt              # octal: rw- r-- ---
chmod u+x,g+x,o-r compilar.sh      # simbólico, partiendo de 644 (rw-r--r--) → rwxr-x---
chmod 750 datos                    # el grupo entra (x) y lista (r), pero no crea (sin w)
stat -c '%a %A %n' informe.txt compilar.sh datos

La salida real coincide con la esperada:

$ touch informe.txt compilar.sh
$ mkdir datos
$ chmod 640 informe.txt
$ chmod u+x,g+x,o-r compilar.sh
$ chmod 750 datos
$ stat -c '%a %A %n' informe.txt compilar.sh datos
640 -rw-r----- informe.txt
750 -rwxr-x--- compilar.sh
750 drwxr-x--- datos

Por qué está hecho así:

  • informe.txt con octal: queremos unos permisos exactos y 640 se lee directo (6 = 4 + 2 = rw-, 4 = r--, 0 = ---).
  • compilar.sh con simbólico, partiendo de 644. Esta es la traza de la orden u+x,g+x,o-r, que se aplica de izquierda a derecha:
ParteAntesDespuésCuenta
u+x644 rw-r--r--744 rwxr--r--6 + 1 = 7
g+x744754 rwxr-xr--4 + 1 = 5
o-r754750 rwxr-x---4 − 4 = 0
  • datos a 750 y no a 740: sin la x el grupo vería los nombres, pero no podría entrar (fragmento 2). Y no a 770, porque la w le dejaría crear y borrar.

La alternativa obvia para compilar.sh, chmod u+x compilar.sh, se queda en 744: el grupo no podría ejecutarlo y otros podrían leerlo.

Solución del nivel 2

umask 027                # quita w al grupo (2) y todo a otros (7)
umask                    # comprobación en octal
umask -S                 # y en letras: lo que SÍ se deja
touch acta.txt
mkdir capturas
stat -c '%a %A %n' acta.txt capturas

La salida real:

$ umask 027
$ umask
0027
$ umask -S
u=rwx,g=rx,o=
$ touch acta.txt
$ mkdir capturas
$ stat -c '%a %A %n' acta.txt capturas
640 -rw-r----- acta.txt
750 drwxr-x--- capturas

Por qué está hecho así: comparamos casilla a casilla lo que hay que apagar:

DueñoGrupoOtros
Fichero que se pide (666)rw-rw-rw-
Lo que queremos (640)rw-r-----
Hay que apagarnada → 0w → 2todo → 7

La umask es 027. Comprobación con el directorio: 777 sin ----w-rwx = rwx r-x --- = 750. Fíjate en que para otros ponemos 7 y no 6: en el fichero no hay x que quitar, pero en el directorio sí, y sin ese 1 las carpetas saldrían 751.

La alternativa obvia, umask 640, es el fragmento 3 otra vez: ficheros 026 (----w-rw-) que ni el dueño puede leer.

Solución del nivel 3

# @sergio — Sergio prepara la carpeta común de entregas
mkdir entregas
chgrp ic2 entregas
chmod 3770 entregas        # 3 = 2 (setgid) + 1 (sticky) · 770 = dueño y grupo todo, otros nada
ls -ld entregas
touch entregas/sergio.txt
# @laura — Laura entrega lo suyo e intenta borrar lo de Sergio
touch entregas/laura.txt
ls -l entregas
rm entregas/sergio.txt
rm entregas/laura.txt
ls entregas
# @pablo — Pablo no es del grupo
ls entregas

La salida real:

sergio$ mkdir entregas
sergio$ chgrp ic2 entregas
sergio$ chmod 3770 entregas
sergio$ ls -ld entregas
drwxrws--T 2 sergio ic2 4096 Oct 25 16:49 entregas
sergio$ touch entregas/sergio.txt
laura$ touch entregas/laura.txt
laura$ ls -l entregas
total 0
-rw-r--r-- 1 laura  ic2 0 Oct 25 16:49 laura.txt
-rw-r--r-- 1 sergio ic2 0 Oct 25 16:49 sergio.txt
laura$ rm entregas/sergio.txt
rm: cannot remove 'entregas/sergio.txt': Operation not permitted
laura$ rm entregas/laura.txt
laura$ ls entregas
sergio.txt
pablo$ ls entregas
ls: cannot open directory 'entregas': Permission denied

Por qué está hecho así: el número 3770 tiene dos partes:

CifraValorSignificado
3 = 2 + 1setgid + stickyheredar el grupo y que cada uno solo borre lo suyo
7rwxdueño: todo
7rwxgrupo: entrar, listar y crear
0---otros: nada

El dibujo junta los dos bits especiales con lo que provocan:

La carpeta de entregas con 3770 La carpeta de entregas queda drwxrws–T: la s del grupo (setgid) hace que los ficheros nuevos sean del grupo ic2 y la T (sticky) impide que Laura borre el fichero de Sergio; Pablo no puede ni listar. chmod 3770 entregas: setgid + sticky drwxrws––T 3770 sergio ic2 entregas/ s = setgid (2) lo nuevo hereda el grupo ic2 (minúscula: el grupo también tiene x) T = sticky (1) cada uno solo borra lo suyo (mayúscula: otros no tienen x) ls -l entregas (laura) -rw-r–r– laura ic2 laura.txt -rw-r–r– sergio ic2 sergio.txt laura$ rm entregas/sergio.txt   laura$ rm entregas/laura.txt   pablo$ ls entregas   rm de lo ajeno: Operation not permitted
Fíjate en los dos ficheros: dueños distintos, pero el mismo grupo ic2 gracias a la s.
  • chgrp ic2 antes del chmod: el setgid hace que lo nuevo herede el grupo de la carpeta, así que la carpeta tiene que ser de ic2. Si no, todo heredaría el grupo sergio.
  • La s minúscula en el grupo (rws) indica setgid con x. Por eso laura.txt sale con grupo ic2, aunque el grupo principal de Laura sea laura.
  • La T mayúscula en otros (--T) indica sticky sin la x de otros (otros tienen 0). Por eso Laura recibe Operation not permitted al borrar sergio.txt aunque tenga w en la carpeta, y en cambio borra su laura.txt sin problemas.
  • Pablo es «otros» y tiene ---: ni siquiera lista.

La alternativa obvia, chmod 770 entregas, cumple el requisito 1 pero no el 2 (los ficheros de Laura serían del grupo laura) ni el 3 (Laura podría borrar sergio.txt).

Pruébalo en tu terminal

En vez de Python Tutor, vuelve a vivir el fragmento 2 en tu terminal, en pequeño. Teclea las órdenes que van detrás de cada $ en tu carpeta de pruebas:

$ mkdir caja
$ touch caja/nota.txt
$ chmod 644 caja
$ ls -l caja
ls: cannot access 'caja/nota.txt': Permission denied
total 0
-????????? ? ? ? ?            ? nota.txt
$ chmod 755 caja
$ ls -l caja
total 0
-rw-r--r-- 1 sergio sergio 0 Oct 25 16:49 nota.txt

Qué observar:

  1. Tras chmod 644 caja, ls -l caja enseña el nombre nota.txt (gracias a la r), pero con interrogaciones en todas las columnas (falta la x).
  2. El aviso cannot access sale antes del listado: ls intenta consultar el fichero y no puede atravesar la carpeta.
  3. Tras chmod 755 caja vuelve todo: permisos, dueño, grupo, tamaño y fecha.
  4. Prueba tú un paso más: chmod 711 caja y ls caja. ¿Qué crees que pasa ahora? ¿Y cat caja/nota.txt?

Chuletario: permisos en Linux

Lo esencial en 30 segundos

  • ls -l → tipo + tres tríos rwx: dueño, grupo, otros, siempre en ese orden.
  • Octal: r = 4, w = 2, x = 1; una cifra por trío (754 = rwxr-xr--).
  • Simbólico: a quién (u g o a) + operación (+ - =) + permisos (r w x X).
  • En una carpeta: r = listar, w = crear y borrar, x = entrar.
  • La umask quita: 666 y 777 menos la máscara (022 → 644 y 755).
  • Cambiar el dueño (chown) solo puede root; el grupo (chgrp), a uno de tus grupos.
  • Cuarta cifra: setuid 4, setgid 2, sticky 1.

Leer y cambiar permisos

Quiero…OrdenResultado
ver permisos, dueño y grupols -l fichero-rw-r--r-- 1 sergio ic2 …
ver los de una carpeta, no su contenidols -ld carpetadrwxr-x--- …
ver octal y letras juntosstat -c '%a %A %n' fichero640 -rw-r----- fichero
hacer ejecutable un scriptchmod u+x script.shrwxr--r--
fichero del grupo, solo lecturachmod 640 ficherorw-r-----
fichero privadochmod 600 ficherorw-------
carpeta del grupo (entrar y listar)chmod 750 carpetarwxr-x---
carpeta donde el grupo creachmod 770 carpetarwxrwx---
quitar todo a otros en un árbolchmod -R o-rwx carpetaotros = --- en todo
que todos lean un árbol sin romperlochmod -R u=rwX,go=rX carpetacarpetas 755, ficheros 644

Dueño, grupo, umask y bits especiales

Quiero…OrdenResultado
ver mis gruposidgroups=1001(sergio),1010(ic2)
pasar un árbol a mi grupochgrp -R ic2 carpetagrupo ic2 en todo
cambiar el dueño (root)sudo chown laura ficherodueño laura
ver la umaskumask / umask -S0022 / u=rwx,g=rx,o=rx
lo nuevo, 640 y 750umask 027ficheros 640, carpetas 750
lo nuevo, privadoumask 077ficheros 600, carpetas 700
carpeta que hereda el grupochmod 2770 carpetadrwxrws---
carpeta donde cada uno borra lo suyochmod 1777 carpetadrwxrwxrwt
entregas de grupochmod 3770 carpetadrwxrws--T

Plantillas de los ejercicios

# Nivel 1: octal para lo exacto, simbólico para modificar
chmod 640 informe.txt
chmod u+x,g+x,o-r compilar.sh      # 644 → 750
chmod 750 datos
# Nivel 2: umask = lo que se apaga
umask 027                          # ficheros 640, carpetas 750
# Nivel 3: carpeta común de entregas
chgrp ic2 entregas
chmod 3770 entregas                # setgid + sticky

Con estas órdenes, los niveles dan 640/750/750, 640/750 y drwxrws--T.

Síntoma y causa probable

SíntomaCausa probable
bash: ./script.sh: Permission deniedal script le falta la x del dueño: chmod u+x
cd: carpeta: Permission denieda la carpeta le falta la x de tu clase
-????????? en ls -lla carpeta tiene r pero no x
cannot open directorya la carpeta le falta la r de tu clase
no puedes crear ni borrar dentroa la carpeta le falta la w (y la x)
chown: … Operation not permittedsolo root cambia el dueño
rm: … Operation not permitted en una carpeta compartidasticky: no es tu fichero
los ficheros nuevos salen rarosrevisa la umask (umask, umask -S)
siendo el dueño no puedes, aunque el grupo síLinux solo mira el trío del dueño

Antes de entregar, pregúntate

  1. ¿He escrito los tríos en orden: dueño, grupo y otros?
  2. ¿Tienen todas las carpetas del camino la x de quien tiene que llegar al fichero?
  3. ¿He usado -R con un número donde había carpetas y ficheros mezclados?
  4. ¿Lo he probado con un usuario normal, y no como root?
Sigue aprendiendoTodos los artículos de Linux

¿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 *