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:

  1. Montar la carpeta del grupo con chgrp y chmod en octal.
  2. Probarla con tres usuarios (Laura, del grupo; Pablo, de fuera; y yo, el dueño) y arreglar lo que falla con chmod simbólico.
  3. Un revisor de permisos en bash que avisa de lo que «otros» pueden tocar, más una umask para 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.

Antes de empezar

Conviene tener claro:

  • Cómo se lee una línea de ls -l: tipo y tres tríos rwx (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 x es «entrar» y la w es «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:

  1. Crear la estructura (mkdir -p, touch, el script con un heredoc).
  2. Pasar todo al grupo con un solo chgrp -R: así no hay que ir fichero por fichero.
  3. Poner los permisos por tipo: las carpetas, todas a 750 (yo rwx; el grupo r-x para entrar y listar; otros nada); los ficheros que el grupo lee, 640; mis apuntes, 600; el script, 750 para que el grupo lo pueda ejecutar.
  4. 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.
  • docs y src: drwxr-x---: el grupo puede entrar (x) y listar (r), pero no crear nada dentro (no hay w).
  • apuntes-privados.txt: -rw------- = 6 0 0, solo yo.
  • entrega.txt y main.c: -rw-r----- = 6 4 0: el grupo lee, pero no escribe.
  • La columna del grupo es ic2 en todas las líneas gracias al chgrp -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:

Permisos de la carpeta del grupo Árbol de practica-ic2 con los permisos que deja montar.sh: carpetas 750, compilar.sh 750, entrega.txt y main.c 640, apuntes-privados.txt 600; todo con dueño sergio y grupo ic2. La carpeta del trabajo después de montar.sh dueño: sergio · grupo: ic2 (sergio, laura) · otros: pablo y el resto u g o practica-ic2/ drwxr–x––– 750 el grupo entra y lista compilar.sh –rwxr–x––– 750 el grupo lo ejecuta docs/ drwxr–x––– 750 el grupo entra y lista apuntes-privados.txt –rw––––––– 600 solo Sergio entrega.txt –rw–r––––– 640 el grupo lo lee src/ drwxr–x––– 750 el grupo entra y lista main.c –rw–r––––– 640 el grupo lo lee
Otros (coral) se quedan sin nada en todo el árbol; el grupo (azul) lee y entra, pero todavía no escribe en ningún sitio.

Así evolucionan los permisos de practica-ic2/ a lo largo del programa:

PasoOrdenPermisos de practica-ic2/Grupo
1mkdir -p …755 rwxr-xr-x (umask 022)sergio
2chgrp -R ic2 practica-ic2755 rwxr-xr-xic2
3chmod 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ínea chmod 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 que docs/).

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/docs funciona: Laura es del grupo, y tanto practica-ic2/ como docs/ tienen r-x para 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 (tiene r-x para el grupo), pero falla dentro: ld: cannot open output file main: Permission denied. El enlazador quiere crear main en practica-ic2/ y crear un fichero es escribir en la carpeta, para lo que el grupo no tiene w. Esta es la anécdota del principio.
  • echo … >> docs/entrega.txt: Permission denied, porque el grupo solo tiene r-- en entrega.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 de entrega.txt: sin x en practica-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:

Qué puede hacer cada usuario Resultados reales de p2: Laura lista docs pero no lee los apuntes privados, ni compila ni escribe la entrega; Pablo no entra. Tras chmod g+w, Laura compila y escribe. Laura y Pablo prueban la carpeta Quién Orden Lo decide Laura ls docs   grupo r-x en docs/ (750) Laura cat apuntes-privados.txt   grupo — (600) Laura ./compilar.sh   grupo sin w en practica-ic2/: ld no crea main Laura >> docs/entrega.txt   grupo r– en entrega.txt (640) Pablo ls practica-ic2   otros — en la carpeta (750) Pablo cat docs/entrega.txt   otros sin x: ni siquiera llega sergio$ chmod g+w practica-ic2 docs/entrega.txt Laura ./compilar.sh   carpeta 770: ya puede crear main Laura >> docs/entrega.txt   entrega.txt 660
Cada fallo tiene un responsable concreto en un trío; la banda violeta es el único cambio de Sergio.

Esta es la traza de los intentos de Laura, con la clase y el trío que mira Linux:

IntentoClaseDónde miraTrío¿Hace falta?Resultado
ls docsgrupodocs/r-xr y xSí
cat apuntes-privados.txtgrupoel fichero---rNo
./compilar.sh (crear main)grupopractica-ic2/r-xw y xNo
>> docs/entrega.txtgrupoel ficheror--wNo
./compilar.sh tras g+wgrupopractica-ic2/rwxw y xSí
>> docs/entrega.txt tras g+wgrupoel ficherorw-wSí

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? ¿Necesita w en docs/?
  • Deja la entrega en 660 pero quita la w del grupo de docs/. ¿Puede Laura seguir añadiendo líneas con >>? ¿Y crear docs/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:

Vueltafmodootros¿Aviso?problemas
1practica-ic27555sí1
2practica-ic2/compilar.sh7500no1
3practica-ic2/docs7500no1
4practica-ic2/docs/apuntes-privados.txt6444sí2
5practica-ic2/docs/entrega.txt6400no2
6practica-ic2/src7500no2
7practica-ic2/src/main.c6400no2

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 .txt tiene la x puesta (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 denied vienen de la carpeta (crear o borrar dentro, o atravesarla sin x).
  • chmod -R con un número: aplica lo mismo a carpetas y ficheros; las carpetas se quedan sin x o los ficheros con x de más.
  • Olvidar el chgrp: con el grupo sergio, 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 w al 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:

  1. chmod 070 deja el fichero con todo para el grupo y nada para el dueño ni para otros.
  2. id -gn confirma que tu grupo principal es el mismo que el del fichero (el que le puso touch).
  3. cat prueba.txt falla aunque estés en el grupo con rwx: como eres el dueño, Linux solo mira el primer trío, y es ---. No «suma» los permisos del grupo.
  4. Con 670 el dueño recupera rw- y el cat funciona. El stat final enseña -rw-rwx---.

Resumen

  • Las carpetas de un grupo de trabajo van a 750 (o a 770 si el grupo debe crear cosas dentro); los ficheros que el grupo lee, a 640; lo privado, a 600.
  • chgrp -R grupo carpeta es 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 (027 para un grupo) hace que lo nuevo nazca bien; chmod arregla 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.sh pero 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-rwx es seguro y chmod -R 640 no?

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 →

Sigue aprendiendo

Deja una respuesta

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