Permisos 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)
Primera semana con la carpeta compartida del trabajo de IC2. Yo la había montado con todo el cuidado del mundo: el grupo ic2 podía entrar, leer el código y ejecutar el script de compilar; los demás, nada. A los diez minutos, mensaje de Laura: *»No me deja compilar. Me sale algo de ld: cannot open output file«. Yo, convencido: *»Imposible, el script tiene la x del grupo». Tenía razón… y no servía de nada. El script se ejecutaba perfectamente; lo que no podía hacer era crear el programa compilado, porque eso es escribir en la carpeta, y a la carpeta le había quitado la w del grupo. Lección que se repite en toda la práctica: cada acción necesita un permiso concreto en un sitio concreto, y casi nunca es el sitio en el que miras primero.
Esta práctica pone en marcha todo lo de la teoría de permisos en Linux con tres programas (aquí, tres sesiones de terminal y un script) de nivel medio:
- Montar la carpeta del grupo con
chgrpychmoden octal. - Probarla con tres usuarios (Laura, del grupo; Pablo, de fuera; y yo, el dueño) y arreglar lo que falla con
chmodsimbólico. - Un revisor de permisos en bash que avisa de lo que «otros» pueden tocar, más una
umaskpara lo que se cree después.
Los datos se parecen a los de verdad a propósito: un fichero privado que se cuela en la carpeta común, un despiste que deja la carpeta abierta a todos y una compañera que no puede hacer su parte.
Tabla de Contenidos
Antes de empezar
Conviene tener claro:
- Cómo se lee una línea de
ls -l: tipo y tres tríosrwx(dueño, grupo, otros). - Los pesos del octal:
r= 4,w= 2,x= 1. - El modo simbólico: a quién (
u,g,o,a), qué operación (+,-,=) y qué permisos. - Que en una carpeta la
xes «entrar» y lawes «crear y borrar dentro».
Si alguno te suena dudoso, repasa la teoría antes de seguir.
Para reproducir la práctica completa necesitas varios usuarios. En tu propio Linux (o en la máquina virtual de prácticas) puedes crearlos con sudo adduser laura, sudo adduser pablo y sudo groupadd ic2, y meter a los dos primeros en el grupo con sudo usermod -aG ic2 sergio y sudo usermod -aG ic2 laura (cambia sergio por tu usuario). Después abre una terminal como cada uno con su - laura. Si no puedes usar sudo, sigue la práctica leyendo las salidas: son las reales.
Programa 1: montar la carpeta del grupo
Hay que preparar practica-ic2/ para un trabajo de C: una carpeta src/ con el código, otra docs/ con la entrega y unos apuntes privados míos, y un script compilar.sh. Queremos que el grupo ic2 pueda entrar, leer el código y la entrega y compilar, que mis apuntes sean solo míos y que nadie de fuera vea nada. Lo que lo complica es que hay que decidir los permisos de siete cosas distintas, y las carpetas y los ficheros no se tratan igual.
La idea
El orden importa:
- Crear la estructura (
mkdir -p,touch, el script con un heredoc). - Pasar todo al grupo con un solo
chgrp -R: así no hay que ir fichero por fichero. - Poner los permisos por tipo: las carpetas, todas a
750(yorwx; el grupor-xpara entrar y listar; otros nada); los ficheros que el grupo lee,640; mis apuntes,600; el script,750para que el grupo lo pueda ejecutar. - Comprobar con
ls -lR, que lista también el contenido de las subcarpetas.
Usamos octal porque queremos unos permisos exactos, no añadir o quitar sobre lo que ya hubiera.
Antes de programar, piensa en cada carpeta como una puerta: el grupo necesita x en todas las del camino para llegar a un fichero. Si practica-ic2/ no tiene la x del grupo, dará igual lo que pongas en docs/entrega.txt.
El código
# 1. La estructura del trabajo: código en src/, documentos en docs/
mkdir -p practica-ic2/src practica-ic2/docs
cat > practica-ic2/src/main.c << 'EOF'
int main(void) { return 0; }
EOF
touch practica-ic2/docs/entrega.txt practica-ic2/docs/apuntes-privados.txt
cat > practica-ic2/compilar.sh << 'EOF'
#!/bin/bash
gcc -Wall -std=c11 src/main.c -o main && echo "OK"
EOF
# 2. Todo el árbol pasa al grupo del trabajo (-R = recursivo)
chgrp -R ic2 practica-ic2
# 3. Carpetas: yo todo, el grupo entra y lista, otros fuera
chmod 750 practica-ic2 practica-ic2/src practica-ic2/docs
# 4. Ficheros: el grupo lee el código y la entrega; mis apuntes, solo yo
chmod 640 practica-ic2/src/main.c practica-ic2/docs/entrega.txt
chmod 600 practica-ic2/docs/apuntes-privados.txt
chmod 750 practica-ic2/compilar.sh # el grupo también lo puede ejecutar
# 5. Comprobación: -R lista también lo que hay dentro de cada carpeta
ls -lR practica-ic2
La parte con más miga son los cuatro chmod del final. Míralos aparte:
# 3. Carpetas: yo todo, el grupo entra y lista, otros fuera chmod 750 practica-ic2 practica-ic2/src practica-ic2/docs # 4. Ficheros: el grupo lee el código y la entrega; mis apuntes, solo yo chmod 640 practica-ic2/src/main.c practica-ic2/docs/entrega.txt chmod 600 practica-ic2/docs/apuntes-privados.txt chmod 750 practica-ic2/compilar.sh # el grupo también lo puede ejecutar
Cada chmod acepta varios ficheros a la vez, así que agrupamos por permisos: una línea para todo lo que lleva 750 en carpetas, otra para los 640… Es más corto y, sobre todo, más fácil de revisar: si mañana decides que la entrega tiene que ser 660, sabes en qué línea tocar. El script se queda en una línea propia porque, aunque comparte número con las carpetas, la razón es distinta (en un fichero, la x es «ejecutar», no «entrar»).
Salida
$ mkdir -p practica-ic2/src practica-ic2/docs
$ cat > practica-ic2/src/main.c << 'EOF'
> int main(void) { return 0; }
> EOF
$ touch practica-ic2/docs/entrega.txt practica-ic2/docs/apuntes-privados.txt
$ cat > practica-ic2/compilar.sh << 'EOF'
> #!/bin/bash
> gcc -Wall -std=c11 src/main.c -o main && echo "OK"
> EOF
$ chgrp -R ic2 practica-ic2
$ chmod 750 practica-ic2 practica-ic2/src practica-ic2/docs
$ chmod 640 practica-ic2/src/main.c practica-ic2/docs/entrega.txt
$ chmod 600 practica-ic2/docs/apuntes-privados.txt
$ chmod 750 practica-ic2/compilar.sh
$ ls -lR practica-ic2
practica-ic2:
total 12
-rwxr-x--- 1 sergio ic2 63 Oct 25 16:49 compilar.sh
drwxr-x--- 2 sergio ic2 4096 Oct 25 16:49 docs
drwxr-x--- 2 sergio ic2 4096 Oct 25 16:49 src
practica-ic2/docs:
total 0
-rw------- 1 sergio ic2 0 Oct 25 16:49 apuntes-privados.txt
-rw-r----- 1 sergio ic2 0 Oct 25 16:49 entrega.txt
practica-ic2/src:
total 4
-rw-r----- 1 sergio ic2 29 Oct 25 16:49 main.c
Comprobemos a mano lo que importa:
compilar.sh:-rwxr-x---= 7 5 0. Yo lo leo, lo modifico y lo ejecuto; el grupo lo lee y lo ejecuta; otros, nada.docsysrc:drwxr-x---: el grupo puede entrar (x) y listar (r), pero no crear nada dentro (no hayw).apuntes-privados.txt:-rw-------= 6 0 0, solo yo.entrega.txtymain.c:-rw-r-----= 6 4 0: el grupo lee, pero no escribe.- La columna del grupo es
ic2en todas las líneas gracias alchgrp -R.
La carpeta raíz no sale en su propio listado, pero la pusimos a 750 con el mismo chmod. El dibujo resume el árbol completo:
Así evolucionan los permisos de practica-ic2/ a lo largo del programa:
| Paso | Orden | Permisos de practica-ic2/ | Grupo |
|---|---|---|---|
| 1 | mkdir -p … | 755 rwxr-xr-x (umask 022) | sergio |
| 2 | chgrp -R ic2 practica-ic2 | 755 rwxr-xr-x | ic2 |
| 3 | chmod 750 practica-ic2 … | 750 rwxr-x--- | ic2 |
Fíjate en que, tal como queda, el grupo no puede escribir en ningún sitio. ¿Es lo que queremos? El programa 2 lo pone a prueba.
Preguntas que te puedes hacer
¿Por qué chgrp -R antes que los chmod? El orden en realidad da igual para el resultado, pero hacerlo primero evita una ventana en la que la carpeta tiene los permisos de grupo ya abiertos y todavía pertenece al grupo sergio. Es una buena costumbre: primero decides quién, después qué.
¿Por qué las carpetas 750 y no 740? Porque una carpeta con r y sin x deja ver los nombres pero no entrar ni abrir nada (lo viste en la teoría). Al grupo le daríamos una lista de nombres inútil.
¿Por qué no usar chmod -R 750 practica-ic2 y acabar antes? Porque -R aplica el mismo número a todo: main.c y entrega.txt acabarían con x (como si fueran programas) y tus apuntes privados serían legibles por el grupo. El octal con -R solo sirve si todo debe quedar igual.
¿Y si Laura crea un fichero dentro? Nacería con su grupo principal (laura), no con ic2. Lo arreglamos con el bit setgid en el nivel 3 de los ejercicios.
¿Hace falta que main.c tenga x para compilarlo? No. gcc solo necesita leer el .c; la x la necesita el programa que se genera (y ese lo crea gcc con 755 automáticamente, porque el enlazador sí la pide).
Poner los permisos al fichero y olvidarse de las carpetas del camino. Si docs/ no tuviera la x del grupo, Laura no podría leer entrega.txt aunque el fichero fuera 644.
Pruébalo tú
- Cambia el programa para que mis apuntes vivan fuera de la carpeta común (por ejemplo, en
~/privado/) y quita la líneachmod 600. ¿Qué carpeta hay que proteger ahora? - Añade una carpeta
entregas-finales/que el grupo pueda listar pero no modificar. ¿Qué número le das? (Pista: igual quedocs/).
Programa 2: probarlo con tres usuarios
Montar está bien, pero los permisos no se comprueban mirándolos: se comprueban usándolos. En este programa, Laura (grupo ic2) y Pablo (de fuera) intentan hacer cosas reales con la carpeta: listar, leer, compilar y escribir en la entrega. Después yo arreglo lo justo y Laura lo vuelve a intentar. Partimos de la carpeta tal como la dejó el programa 1.
La idea
Para cada intento hay que responder dos preguntas: ¿qué clase aplica? (Laura es del grupo, Pablo es «otros») y ¿qué permiso hace falta y dónde? (en el fichero o en la carpeta). Después, cuando algo falle, se arregla con chmod simbólico: no queremos recalcular el número entero, solo añadir una w al grupo en dos sitios.
Antes de mirar la salida, apunta en un papel qué crees que pasará con cada orden. Es el mejor ejercicio de este tema.
El código
Cada línea # @usuario significa que a partir de ahí las órdenes las teclea esa persona en su terminal:
# @laura — Laura (grupo ic2) prueba la carpeta desde su terminal ls practica-ic2/docs cat practica-ic2/docs/apuntes-privados.txt cd practica-ic2 ./compilar.sh echo "Parte de Laura: ejercicio 2" >> docs/entrega.txt # @pablo — Pablo (otra clase, no está en ic2) curiosea ls practica-ic2 cat practica-ic2/docs/entrega.txt # @sergio — Sergio abre lo justo: escribir en la carpeta y en la entrega chmod g+w practica-ic2 practica-ic2/docs/entrega.txt stat -c '%a %A %n' practica-ic2 practica-ic2/docs/entrega.txt # @laura — Laura vuelve a intentarlo ./compilar.sh echo "Parte de Laura: ejercicio 2" >> docs/entrega.txt cat docs/entrega.txt
Salida
laura$ ls practica-ic2/docs apuntes-privados.txt entrega.txt laura$ cat practica-ic2/docs/apuntes-privados.txt cat: practica-ic2/docs/apuntes-privados.txt: Permission denied laura$ cd practica-ic2 laura$ ./compilar.sh /usr/bin/ld: cannot open output file main: Permission denied collect2: error: ld returned 1 exit status laura$ echo "Parte de Laura: ejercicio 2" >> docs/entrega.txt bash: docs/entrega.txt: Permission denied pablo$ ls practica-ic2 ls: cannot open directory 'practica-ic2': Permission denied pablo$ cat practica-ic2/docs/entrega.txt cat: practica-ic2/docs/entrega.txt: Permission denied sergio$ chmod g+w practica-ic2 practica-ic2/docs/entrega.txt sergio$ stat -c '%a %A %n' practica-ic2 practica-ic2/docs/entrega.txt 770 drwxrwx--- practica-ic2 660 -rw-rw---- practica-ic2/docs/entrega.txt laura$ ./compilar.sh OK laura$ echo "Parte de Laura: ejercicio 2" >> docs/entrega.txt laura$ cat docs/entrega.txt Parte de Laura: ejercicio 2
Vamos intento por intento:
laura$ ls practica-ic2/docsfunciona: Laura es del grupo, y tantopractica-ic2/comodocs/tienenr-xpara el grupo. Ve los dos nombres.cat … apuntes-privados.txt:Permission denied. El trío del grupo es---(600). Lo que queríamos../compilar.sh: el script sí arranca (tiener-xpara el grupo), pero falla dentro:ld: cannot open output file main: Permission denied. El enlazador quiere crearmainenpractica-ic2/y crear un fichero es escribir en la carpeta, para lo que el grupo no tienew. Esta es la anécdota del principio.echo … >> docs/entrega.txt:Permission denied, porque el grupo solo tiener--enentrega.txt.pablo$ ls practica-ic2:cannot open directory. Pablo es «otros», y otros tienen---en la carpeta.pablo$ cat practica-ic2/docs/entrega.txt: también falla, y ni siquiera llega a mirar los permisos deentrega.txt: sinxenpractica-ic2/no puede atravesar la primera puerta.
Después, una sola orden mía: chmod g+w practica-ic2 practica-ic2/docs/entrega.txt. El stat confirma 770 en la carpeta (7 7 0: 5 + 2 = 7 para el grupo) y 660 en la entrega (4 + 2 = 6). Laura repite y ahora sale OK al compilar, su línea se añade a la entrega y cat la muestra.
El dibujo junta todos los intentos con el permiso que decide cada uno:
Esta es la traza de los intentos de Laura, con la clase y el trío que mira Linux:
| Intento | Clase | Dónde mira | Trío | ¿Hace falta? | Resultado |
|---|---|---|---|---|---|
ls docs | grupo | docs/ | r-x | r y x | Sí |
cat apuntes-privados.txt | grupo | el fichero | --- | r | No |
./compilar.sh (crear main) | grupo | practica-ic2/ | r-x | w y x | No |
>> docs/entrega.txt | grupo | el fichero | r-- | w | No |
./compilar.sh tras g+w | grupo | practica-ic2/ | rwx | w y x | Sí |
>> docs/entrega.txt tras g+w | grupo | el fichero | rw- | w | Sí |
Preguntas que te puedes hacer
¿Por qué el script se ejecuta si luego falla? Porque son dos permisos distintos en dos sitios distintos. Ejecutar compilar.sh mira la x del fichero; crear main mira la w de la carpeta. El primer Permission denied que ves no siempre es del primer paso.
¿Por qué g+w y no chmod 770? Con la carpeta daría lo mismo, pero en la misma orden va entrega.txt, que necesita 660. Con el simbólico, una sola orden añade la w del grupo a las dos cosas respetando lo que ya tenían.
Ahora que el grupo escribe en practica-ic2/, ¿puede Laura borrar mi compilar.sh? Sí. Aunque no pueda modificarlo (el grupo tiene r-x en el script), borrar es quitar un nombre de la carpeta, y en esa carpeta ya tiene w. Es el precio de abrirla, y lo arregla el bit sticky (nivel 3 de los ejercicios). Mis apuntes siguen a salvo porque están en docs/, que no tiene la w del grupo.
¿Por qué Pablo no ve ni los nombres? Porque ls necesita la r de la carpeta para leer su lista, y otros tienen ---.
Arreglar un Permission denied dando permisos al fichero que sale en el mensaje sin pensar qué acción fallaba. El error de Laura mencionaba main, un fichero que ni siquiera existía: el permiso que faltaba era el de la carpeta.
Pruébalo tú
- Después del arreglo, haz que Laura intente
rm docs/apuntes-privados.txt. ¿Qué crees que pasa? ¿Necesitawendocs/? - Deja la entrega en
660pero quita lawdel grupo dedocs/. ¿Puede Laura seguir añadiendo líneas con>>? ¿Y creardocs/parte-laura.txt?
Programa 3: un revisor de permisos y la umask del grupo
Con varios usuarios tocando la carpeta, tarde o temprano alguien deja algo abierto. Este programa tiene dos partes: un script, revisar.sh, que recorre la carpeta y avisa de todo lo que «otros» pueden tocar, y una sesión que provoca dos despistes, los detecta, los arregla y fija una umask para que lo nuevo nazca ya bien.
La idea
Para saber si «otros» pueden hacer algo con un fichero, basta con mirar la última cifra octal de sus permisos: si es 0, otros no pueden nada; si no, hay un aviso. stat -c '%a' nos da el número y bash puede quedarse con su último carácter. Recorremos todo con find, que lista una carpeta y todo lo que tiene dentro.
Antes de programar, piensa en el orden: find no promete ninguno. Si el informe tiene que salir siempre igual (para compararlo de un día para otro), hay que ordenar.
El código
Primero, el script revisor:
#!/bin/bash
# Revisa una carpeta y avisa de todo lo que "otros" pueden tocar.
carpeta=${1:-.} # la carpeta que se pasa como argumento (o la actual)
problemas=0
# sort: find no garantiza ningún orden; ordenado, el informe sale siempre igual
for f in $(find "$carpeta" | sort); do
modo=$(stat -c '%a' "$f") # permisos en octal, por ejemplo 640
otros=${modo: -1} # el ÚLTIMO dígito es el de otros (vale también con 4 dígitos)
if [ "$otros" -ne 0 ]; then # 0 = otros no pueden nada; cualquier otro valor es un aviso
echo "AVISO $modo $f"
problemas=$((problemas + 1))
fi
done
echo "Problemas: $problemas"
La línea clave es la que se queda con la cifra de otros:
modo=$(stat -c '%a' "$f") # permisos en octal, por ejemplo 640
otros=${modo: -1} # el ÚLTIMO dígito es el de otros (vale también con 4 dígitos)
${modo: -1} es la sintaxis de bash para «el último carácter de la variable» (el espacio antes del -1 es obligatorio; sin él, bash lo interpreta como otra cosa). Funciona tanto con 640 como con un 2770 de cuatro cifras, porque la de otros siempre es la última. Y [ "$otros" -ne 0 ] compara números (-ne = not equal).
Y la sesión que lo usa (parte de la carpeta del programa 1):
chmod u+x revisar.sh # el script llega sin x: se la doy a su dueño chmod 644 practica-ic2/docs/apuntes-privados.txt # un despiste: alguien lo dejó legible para todos chmod o+rx practica-ic2 # y otro: la carpeta abierta a cualquiera ./revisar.sh practica-ic2 chmod -R o-rwx practica-ic2 # -R: quita todo a otros en todo el árbol chmod 600 practica-ic2/docs/apuntes-privados.txt ./revisar.sh practica-ic2 umask 027 # para lo que creemos a partir de ahora touch practica-ic2/docs/acta.txt mkdir practica-ic2/pruebas stat -c '%a %A %n' practica-ic2/docs/acta.txt practica-ic2/pruebas ./revisar.sh practica-ic2
Salida
$ chmod u+x revisar.sh $ chmod 644 practica-ic2/docs/apuntes-privados.txt $ chmod o+rx practica-ic2 $ ./revisar.sh practica-ic2 AVISO 755 practica-ic2 AVISO 644 practica-ic2/docs/apuntes-privados.txt Problemas: 2 $ chmod -R o-rwx practica-ic2 $ chmod 600 practica-ic2/docs/apuntes-privados.txt $ ./revisar.sh practica-ic2 Problemas: 0 $ umask 027 $ touch practica-ic2/docs/acta.txt $ mkdir practica-ic2/pruebas $ stat -c '%a %A %n' practica-ic2/docs/acta.txt practica-ic2/pruebas 640 -rw-r----- practica-ic2/docs/acta.txt 750 drwxr-x--- practica-ic2/pruebas $ ./revisar.sh practica-ic2 Problemas: 0
La primera revisión encuentra justo los dos despistes, y esta es la traza de su bucle:
| Vuelta | f | modo | otros | ¿Aviso? | problemas |
|---|---|---|---|---|---|
| 1 | practica-ic2 | 755 | 5 | sí | 1 |
| 2 | practica-ic2/compilar.sh | 750 | 0 | no | 1 |
| 3 | practica-ic2/docs | 750 | 0 | no | 1 |
| 4 | practica-ic2/docs/apuntes-privados.txt | 644 | 4 | sí | 2 |
| 5 | practica-ic2/docs/entrega.txt | 640 | 0 | no | 2 |
| 6 | practica-ic2/src | 750 | 0 | no | 2 |
| 7 | practica-ic2/src/main.c | 640 | 0 | no | 2 |
Siete entradas revisadas, dos avisos: 755 → otros 5 (r-x) y 644 → otros 4 (r--).
El arreglo usa dos órdenes porque hay dos problemas distintos. chmod -R o-rwx quita todo a otros en todo el árbol sin tocar los permisos del dueño ni del grupo (con el octal y -R habría sido imposible, porque cada cosa tiene un número distinto). Pero eso deja los apuntes en 640, legibles por el grupo, así que los devuelvo a 600 aparte. La segunda revisión da Problemas: 0.
Por último, umask 027: los ficheros nuevos salen 640 (666 sin ----w-rwx) y las carpetas 750 (777 sin lo mismo). Comprobado: acta.txt es 640 y pruebas/ es 750, y la tercera revisión sigue a cero. La carpeta ya no depende de que nadie se acuerde de quitar permisos a mano.
Preguntas que te puedes hacer
¿Por qué $(find … | sort) y no find … -exec? Por el orden: find devuelve las entradas en el orden en que están guardadas en el disco, que puede cambiar. Con sort el informe sale siempre igual. (Tiene una pega: los nombres con espacios se partirían; en esta carpeta no hay ninguno.)
¿Por qué el script empieza sin x? Porque lo copié (o lo descargué) y nace con 644, como cualquier fichero nuevo. Por eso la primera orden de la sesión es chmod u+x revisar.sh: el mismo problema del gancho de la teoría.
¿Por qué la umask es 027 y no 007? 027 quita también la w del grupo a lo que se crea: Laura podrá leer las actas nuevas, pero no modificarlas sin que yo lo decida. Con 007 saldrían 660 y 770.
¿La umask arregla los ficheros que ya existían? No. Solo actúa en el momento de crear. Por eso hacen falta las dos cosas: el chmod -R para lo que ya estaba y la umask para lo que venga.
chmod -R 640 practica-ic2 para «cerrar» la carpeta. Les quita la x a todas las subcarpetas (ya nadie entra, ni el grupo) y al script (ya no se ejecuta). Para quitar permisos a una clase en todo un árbol, usa el simbólico: chmod -R o-rwx.
find practica-ic2 -perm /o=rwx hace lo mismo que el bucle en una línea: lista lo que tiene algún permiso para otros. El script es más largo, pero te enseña cómo se lee un modo y te deja personalizar el aviso.
Pruébalo tú
- Cambia el script para que avise también si un fichero
.txttiene laxpuesta (pista: la cifra del dueño es${modo: -3:1}). - Haz que el script, además de avisar, cuente cuántas entradas ha revisado y lo imprima al final.
Errores típicos en esta práctica
- Mirar solo el fichero: muchos
Permission deniedvienen de la carpeta (crear o borrar dentro, o atravesarla sinx). chmod -Rcon un número: aplica lo mismo a carpetas y ficheros; las carpetas se quedan sinxo los ficheros conxde más.- Olvidar el
chgrp: con el gruposergio, los permisos de grupo no sirven para nada a Laura. - Probar como root o con
sudo: se salta los permisos y te hace creer que todo funciona. - Confiar en la umask para lo que ya existe: solo actúa al crear.
- Abrir la carpeta con
wal grupo y olvidar que eso permite borrar lo de los demás: hace falta el sticky.
Pruébalo en tu terminal
En este tema no hay Python Tutor, así que el paso a paso lo haces tú. Este recorrido solo necesita tu usuario y comprueba algo que sorprende a casi todo el mundo: siendo el dueño, Linux mira solo el trío del dueño, aunque el del grupo te dé permiso. Teclea las órdenes que van detrás de cada $ en una carpeta de pruebas:
$ touch prueba.txt $ chmod 070 prueba.txt $ id -gn sergio $ cat prueba.txt cat: prueba.txt: Permission denied $ chmod 670 prueba.txt $ cat prueba.txt $ stat -c '%a %A %n' prueba.txt 670 -rw-rwx--- prueba.txt
Qué observar:
chmod 070deja el fichero con todo para el grupo y nada para el dueño ni para otros.id -gnconfirma que tu grupo principal es el mismo que el del fichero (el que le pusotouch).cat prueba.txtfalla aunque estés en el grupo conrwx: como eres el dueño, Linux solo mira el primer trío, y es---. No «suma» los permisos del grupo.- Con
670el dueño recuperarw-y elcatfunciona. Elstatfinal enseña-rw-rwx---.
Resumen
- Las carpetas de un grupo de trabajo van a
750(o a770si el grupo debe crear cosas dentro); los ficheros que el grupo lee, a640; lo privado, a600. chgrp -R grupo carpetaes el primer paso para compartir: sin él, los permisos de grupo no sirven a nadie.- Para cada
Permission denied, pregúntate qué acción falla y dónde está el permiso que la decide: en el fichero o en la carpeta. - El octal sirve para fijar permisos exactos; el simbólico, para añadir o quitar sin tocar el resto (sobre todo con
-R). - Un revisor tan sencillo como mirar la última cifra octal detecta lo que otros pueden tocar.
- La umask (
027para un grupo) hace que lo nuevo nazca bien;chmodarregla lo que ya existe.
Checklist: ¿lo has practicado?
- ¿Has ejecutado los tres programas y comprobado las salidas?
- ¿Sabrías explicar por qué Laura podía ejecutar
compilar.shpero no compilar? - ¿Sabes qué número poner a una carpeta para que el grupo entre pero no cree nada?
- ¿Has predicho en papel el resultado de cada intento del programa 2 antes de mirarlo?
- ¿Has intentado los «Pruébalo tú» sin mirar la teoría?
- ¿Sabes por qué
chmod -R o-rwxes seguro ychmod -R 640no?
Si has respondido que sí a casi todo, estás listo para los ejercicios de permisos en Linux, donde ya no te doy los comandos hechos. ¡Nos vemos allí!
Siguiente paso: ejerciciosPermisos en Linux — ejercicios con chmod, umask y una carpeta de entregas compartida (y el chmod -R que me dejó fuera de mi propia carpeta)¿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)