La notación simbólica de chmod no es solo una alternativa estética a los octales: es un mecanismo de modificación relativa. Cuando escribes chmod 644 archivo, estás fijando el estado final completo. Cuando escribes chmod go-w archivo, estás diciendo “quita el bit de escritura a grupo y otros, lo que haya en los demás bits no me importa”. Esa distinción es lo que hace que la notación simbólica sea la elección correcta cuando trabajas sobre permisos existentes que no quieres pisar.
La sintaxis se construye con tres piezas: quién (u para el propietario, g para el grupo, o para otros, a para todos), operador (+ añade sin tocar el resto, - quita, = establece exactamente ese estado y borra todo lo demás para ese ámbito), y permiso (r, w, x, y algunos especiales como s o t). El kernel no entiende símbolos; chmod los traduce internamente a una máscara que aplica con AND, OR o XOR sobre los bits actuales del inodo.
Úsala cuando el valor absoluto no importa pero la diferencia sí: añadir ejecución a un script recién creado, retirar escritura a grupo antes de publicar un fichero, o garantizar lectura universal sin tocar los bits de ejecución que ya estén presentes.
El error clásico es aplicar chmod -R 644 directorio/. Los directorios necesitan el bit de ejecución para ser atravesables: sin él, ni cd ni ninguna resolución de ruta funciona dentro. Con esa orden, todos los directorios internos pierden x y el árbol queda inaccesible. La solución no es chmod recursivo con un único valor, sino separar archivos y directorios con find.
chown y chgrp operan sobre el inodo de la misma forma, pero modifican los campos de UID y GID en lugar de la máscara de permisos. Solo root puede cambiar el propietario de un fichero; el propietario puede cambiar el grupo siempre que sea miembro del grupo destino.
# Escenario: desplegar un sitio estático en /var/www/proyecto
# El servidor web corre como www-data:www-data
# Los desarrolladores pertenecen al grupo webdev
# 1. Transferir propiedad completa del árbol al usuario deploy, grupo webdev
sudo chown -R deploy:webdev /var/www/proyecto
# 2. Directorios: rwxrwxr-x (propietario y grupo pueden leer/escribir/entrar,
# otros solo leer y entrar)
find /var/www/proyecto -type d -exec chmod 775 {} +
# 3. Archivos: rw-rw-r-- (propietario y grupo leen/escriben, otros solo leen)
find /var/www/proyecto -type f -exec chmod 664 {} +
# 4. Los scripts CGI necesitan ejecución solo para el propietario y el grupo;
# usamos simbólico porque ya tenemos 664 y solo queremos añadir x
find /var/www/proyecto/cgi-bin -type f -exec chmod ug+x {} +
# 5. Un fichero de configuración con credenciales: solo el propietario lo lee
chmod 600 /var/www/proyecto/config/db.conf
# 6. El servidor web (www-data) necesita leer los archivos pero no está
# en webdev. Cambiamos solo el grupo de ese fichero concreto.
sudo chgrp www-data /var/www/proyecto/config/db.conf
chmod 640 /var/www/proyecto/config/db.conf
# Verificación
ls -la /var/www/proyecto/config/db.conf
# -rw-r----- 1 deploy www-data 312 jun 10 11:42 db.conf
Qué está pasando en cada paso
El find con -exec chmod {} + en los pasos 2 y 3 es la forma correcta de aplicar permisos recursivos con valores distintos para ficheros y directorios. El + al final agrupa todos los resultados en una sola invocación de chmod en lugar de llamarlo una vez por fichero, lo que es significativamente más rápido en árboles grandes. Si hubieras usado chmod -R 664 /var/www/proyecto, los directorios habrían quedado sin x y el árbol sería intransitable.
El paso 4 usa notación simbólica a propósito. En ese punto los ficheros de cgi-bin ya tienen 664 gracias al paso 3. Escribir chmod ug+x añade ejecución sin tocar los bits de lectura y escritura que ya están configurados. Si hubieras usado chmod 775 habrías dado también escritura a otros, que no es lo que buscas. El operador + opera sobre el estado actual: modifica solo lo que le pides y deja el resto intacto.
El paso 5 con chmod 600 usa octal, no simbólico, y eso es deliberado: aquí sí quieres fijar el estado completo y asegurarte de que no hay ningún bit inesperado. El = simbólico serviría (chmod u=rw,go= config/db.conf), pero el octal es más directo cuando el estado final está completamente definido.
chgrp en el paso 6 en lugar de chown deploy:www-data tiene sentido cuando el propietario no cambia. Son equivalentes en resultado, pero chgrp expresa mejor la intención: solo estás reasignando el grupo. Un lector del historial de comandos o de un script entiende de un vistazo que el UID no se toca.
La separación de UID y GID en chown con la sintaxis usuario:grupo es una extensión GNU; POSIX define chown usuario.grupo. En Debian ambas formas funcionan. Si escribes solo chown deploy /var/www/proyecto, el grupo no cambia aunque lo especifiques después de un espacio: el segundo argumento posicional de chown es el fichero, no el grupo.
N° 36