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.
Tabla de Contenidos
Cómo usar este artículo
- Lee el enunciado y escribe las órdenes en un papel o en un fichero antes de probarlas.
- Pruébalas en una carpeta de pruebas (
mkdir ~/ejercicios-permisos && cd ~/ejercicios-permisos), nunca en tu carpeta personal ni como root. - Compara con la salida esperada. Si no coincide, mira la pista antes que la solución.
- 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:
- El dueño (
sergio) y el grupo pueden entrar, listar y crear; otros, nada. - Todo lo que se cree dentro tiene que pertenecer al grupo
ic2, lo cree quien lo cree. - 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:
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.txtcon octal: queremos unos permisos exactos y640se lee directo (6 = 4 + 2 =rw-, 4 =r--, 0 =---).compilar.shcon simbólico, partiendo de644. Esta es la traza de la ordenu+x,g+x,o-r, que se aplica de izquierda a derecha:
| Parte | Antes | Después | Cuenta |
|---|---|---|---|
u+x | 644 rw-r--r-- | 744 rwxr--r-- | 6 + 1 = 7 |
g+x | 744 | 754 rwxr-xr-- | 4 + 1 = 5 |
o-r | 754 | 750 rwxr-x--- | 4 − 4 = 0 |
datosa750y no a740: sin laxel grupo vería los nombres, pero no podría entrar (fragmento 2). Y no a770, porque lawle 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ño | Grupo | Otros | |
|---|---|---|---|
| Fichero que se pide (666) | rw- | rw- | rw- |
| Lo que queremos (640) | rw- | r-- | --- |
| Hay que apagar | nada → 0 | w → 2 | todo → 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:
| Cifra | Valor | Significado |
|---|---|---|
3 = 2 + 1 | setgid + sticky | heredar el grupo y que cada uno solo borre lo suyo |
7 | rwx | dueño: todo |
7 | rwx | grupo: entrar, listar y crear |
0 | --- | otros: nada |
El dibujo junta los dos bits especiales con lo que provocan:
chgrp ic2antes delchmod: el setgid hace que lo nuevo herede el grupo de la carpeta, así que la carpeta tiene que ser deic2. Si no, todo heredaría el gruposergio.- La
sminúscula en el grupo (rws) indica setgid conx. Por esolaura.txtsale con grupoic2, aunque el grupo principal de Laura sealaura. - La
Tmayúscula en otros (--T) indica sticky sin laxde otros (otros tienen0). Por eso Laura recibeOperation not permittedal borrarsergio.txtaunque tengawen la carpeta, y en cambio borra sulaura.txtsin 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:
- Tras
chmod 644 caja,ls -l cajaenseña el nombrenota.txt(gracias a lar), pero con interrogaciones en todas las columnas (falta lax). - El aviso
cannot accesssale antes del listado:lsintenta consultar el fichero y no puede atravesar la carpeta. - Tras
chmod 755 cajavuelve todo: permisos, dueño, grupo, tamaño y fecha. - Prueba tú un paso más:
chmod 711 cajayls caja. ¿Qué crees que pasa ahora? ¿Ycat caja/nota.txt?
Chuletario: permisos en Linux
Lo esencial en 30 segundos
ls -l→ tipo + tres tríosrwx: 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… | Orden | Resultado |
|---|---|---|
| ver permisos, dueño y grupo | ls -l fichero | -rw-r--r-- 1 sergio ic2 … |
| ver los de una carpeta, no su contenido | ls -ld carpeta | drwxr-x--- … |
| ver octal y letras juntos | stat -c '%a %A %n' fichero | 640 -rw-r----- fichero |
| hacer ejecutable un script | chmod u+x script.sh | rwxr--r-- |
| fichero del grupo, solo lectura | chmod 640 fichero | rw-r----- |
| fichero privado | chmod 600 fichero | rw------- |
| carpeta del grupo (entrar y listar) | chmod 750 carpeta | rwxr-x--- |
| carpeta donde el grupo crea | chmod 770 carpeta | rwxrwx--- |
| quitar todo a otros en un árbol | chmod -R o-rwx carpeta | otros = --- en todo |
| que todos lean un árbol sin romperlo | chmod -R u=rwX,go=rX carpeta | carpetas 755, ficheros 644 |
Dueño, grupo, umask y bits especiales
| Quiero… | Orden | Resultado |
|---|---|---|
| ver mis grupos | id | groups=1001(sergio),1010(ic2) |
| pasar un árbol a mi grupo | chgrp -R ic2 carpeta | grupo ic2 en todo |
| cambiar el dueño (root) | sudo chown laura fichero | dueño laura |
| ver la umask | umask / umask -S | 0022 / u=rwx,g=rx,o=rx |
| lo nuevo, 640 y 750 | umask 027 | ficheros 640, carpetas 750 |
| lo nuevo, privado | umask 077 | ficheros 600, carpetas 700 |
| carpeta que hereda el grupo | chmod 2770 carpeta | drwxrws--- |
| carpeta donde cada uno borra lo suyo | chmod 1777 carpeta | drwxrwxrwt |
| entregas de grupo | chmod 3770 carpeta | drwxrws--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íntoma | Causa probable |
|---|---|
bash: ./script.sh: Permission denied | al script le falta la x del dueño: chmod u+x |
cd: carpeta: Permission denied | a la carpeta le falta la x de tu clase |
-????????? en ls -l | la carpeta tiene r pero no x |
cannot open directory | a la carpeta le falta la r de tu clase |
| no puedes crear ni borrar dentro | a la carpeta le falta la w (y la x) |
chown: … Operation not permitted | solo root cambia el dueño |
rm: … Operation not permitted en una carpeta compartida | sticky: no es tu fichero |
| los ficheros nuevos salen raros | revisa 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
- ¿He escrito los tríos en orden: dueño, grupo y otros?
- ¿Tienen todas las carpetas del camino la
xde quien tiene que llegar al fichero? - ¿He usado
-Rcon un número donde había carpetas y ficheros mezclados? - ¿Lo he probado con un usuario normal, y no como root?
¿Te ha servido este artículo? Así puedes apoyar SergioLearns →




El hardware que sostiene al sistema operativo — teoría con la práctica de IC2 en la impresora, una interrupción que lo para todo y una caché que acierta (y el bucle infinito que no colgó mi portátil)