¿Qué es chmod?
El programa de línea de comandos chmod, abreviatura de change mode (cambiar modo en inglés) se lanza a comienzos de 1970, cuando AT&T publica la primera versión de Unix. En los sistemas operativos tipo Unix multiusuario, chmod sirve para asignar permisos de acceso a carpetas y directorios en sistemas de archivos compatibles con los permisos de archivo típicos de Unix. Esto afecta, por regla general, a todos los sistemas de archivos estándar en las derivaciones de Linux que más se usan para operar servidores. Para hacer cualquier modificación en los atributos de los archivos chmod, es necesario ser propietario del archivo o contar con derechos raíz (administrador).
Linux es una de las opciones más populares entre los administradores de servidores web. En la mayor parte de ellos se instalan distribuciones de este sistema operativo tipo Unix como, por ejemplo, Ubuntu. Una característica común a todos los derivados Unix es la atribución de derechos de acceso a los archivos y directorios. Los usuarios tienen la posibilidad de gestionarlos implementando chmod, un programa de línea de comandos que se activa con el comando chmod en la terminal de Linux.
¿Cómo se utiliza chmod?
En Unix, el sistema de permisos de acceso a los archivos se basa en dos elementos fundamentales: las clases de usuario y los permisos básicos individuales. En la gestión de estos permisos, chmod soporta dos modos diferentes: la notación simbólica con letras (modo simbólico o carácter) y la atribución de permisos con códigos octales de cifras (modo octal). Pero, como dijimos arriba, solo el propietario del archivo o un usuario raíz podrá cambiar los derechos de los usuarios con este comando, que siempre sigue esta sintaxis:
$ chmod options mode file
Al comando chmod le sigue el elemento opcional options, que permite definir opciones avanzadas. El elemento mode representa el modo que se aplicará a file, que podrá ser un archivo o un directorio. El modo indica si una clase de usuario debe recibir permisos de acceso o si los permisos con los que cuenta se han de retirar.
Los modos de chmod
De acuerdo con el sistema de archivos Unix, en un servidor Linux, cada archivo, como también los directorios, cuenta con permisos de acceso propios, que se regulan siempre en base a tres clases de usuarios:
Propietario (user) | Por lo general, cualquier usuario que crea un archivo en un sistema Unix se define automáticamente como user de ese archivo. Con el comando chown puede modificarse esta atribución a posteriori. |
Grupo (group) | La clase grupo aúna en el servidor a varias cuentas de usuario. En sistemas de archivos tipo Unix, cada cuenta se subordina a un grupo principal de forma automática, pero también puede pertenecer a otros grupos. Tanto los propietarios de los archivos, como los usuarios raíz, pueden configurar la asignación de archivos a los grupos con el comando chgrp. |
Otros usuarios (other) | La clase de usuario other abarca a todos los usuarios que no son propietarios de archivos ni miembros de un grupo con derechos de acceso. |
Para establecer los permisos, se cuenta, como se dijo antes, con dos modi diferentes, el simbólico y el octal, que detallaremos en los párrafos siguientes.
Modo simbólico o carácter
En el modo simbólico se asignan letras a las clases de usuarios y a los distintos permisos de acceso posibles. Combinándolos, puede definirse muy fácilmente qué derechos se han de otorgar o retirar y a qué usuarios. La tabla que verás a continuación recoge los caracteres utilizados en la notación simbólica para usuarios y permisos:
Carácter para permisos | Significado |
r | Permiso de lectura (read); también llamado bit R |
w | Permiso de escritura (write); también llamado bit W |
x | Permiso de ejecución (execute); también llamado bit X |
Carácter para clases de usuarios | Significado |
u | user, propietario |
g | group, grupo |
o | other, otros |
a | all, todas las clases |
Si la definición de los derechos se hace por el modo simbólico, para vincular las clases de usuario con sus respectivos permisos se utilizan los siguientes operadores:
+ | Con el operador “+” se asignan más derechos de archivo a una clase de usuario. Solo se sobrescriben los derechos afectados. |
- | El operador “-“retira derechos de acceso a una clase de usuario. |
= | Si los permisos de archivo de una clase de usuario se han de renovar, sin importar qué derechos tuvo antes, se usa el operador “=”. |
Si, por ejemplo, tenemos que modificar el archivo ejemplo.txt para que no solo su propietario (user), sino también todos los demás usuarios (group, other), tengan derechos de lectura y escritura, se tendrá que escribir el siguiente comando chmod:
$ chmod ugo+rw ejemplo.txt
Este cambio también podría aplicarse a todas las clases de usuario:
$ chmod a+rw ejemplo.txt
En el terminal, el archivo ejemplo.txt tendría ahora los siguientes derechos en lugar de los anteriores:
Permisos de acceso antes del cambio | Comando chmod ejecutado | Permisos de acceso después del cambio |
-rw------- | a+rw | -rw-rw-rw- |
user: leer, escribir group: sin permisos other: sin permisos | a = all + = añadir permiso r = read w = write | user: leer, escribir group: leer, escribir other: leer, escribir |
Modo octal
Aunque la notación simbólica es una de las más utilizadas, su uso frecuente puede hacerla inmanejable. Por esta razón, muchos administradores recurren a la notación octal a la hora de atribuir derechos. Se trata de un número de tres cifras en el que cada posición representa una clase de usuario del servidor. La notación octal sigue siempre el mismo orden:
Posición de la cifra de la clase de usuario | Significado |
1 | Corresponde a la clase de usuario “propietario” (user). |
2 | Corresponde a la clase de usuario “grupo” (group). |
3 | Corresponde a la clase de usuario “otros” (other). |
Para saber qué derechos se asignan a cada clase de usuario, basta con verificar el valor de cada cifra. Este resulta de la suma de los valores asociados con los respectivos derechos:
Valor para derechos de acceso | Significado |
4 | Leer |
2 | Escribir |
1 | Ejecutar |
0 | Sin permisos |
De aquí podrían surgir las siguientes combinaciones de derechos de acceso:
Valor | Derecho(s) de acceso |
0 | Ninguno |
1 | Solo ejecutar |
2 | Solo escribir |
3 | Escribir / ejecutar |
4 | Solo leer |
5 | Leer / ejecutar |
6 | Leer / escribir |
7 | Todos los permisos |
Para entender el modo octal, también recurriremos a un ejemplo. Si el propietario del archivo de nuestro ejemplo, ejemplo.txt, quisiera asignar derechos de lectura al grupoXYZ, tendrá que usar el siguiente código octal:
$ chmod 640 ejemplo.txt
Posicionando al valor 6 en primer lugar, el propietario se atribuye derechos de lectura (4) y de escritura (2). El segundo valor especifica los derechos de acceso del grupo: 4 (leer). Para otros usuarios, que ocuparían la tercera posición, no se especificó ningún derecho, indicándolo con un 0.
Opciones del comando chmod
Al margen de si se usa la notación simbólica o la octal, el usuario siempre tendrá a su disposición una amplia gama de opciones en la asignación de derechos de acceso a archivos y directorios. Estos siempre se insertarán en la línea de comandos entre el comando y los permisos (o modos).
Código | Opción | Descripción |
-R | recursive | El cambio de los derechos de acceso se aplica a todos los archivos y subdirectorios dentro de una carpeta. |
-v | verbose | Después del comando se emite un diagnóstico de todos los archivos procesados. |
-c | changes | Después del comando se muestra un diagnóstico para todos los archivos que se han modificado. |
-f | silent | Se silencian los mensajes de error. |
El siguiente ejemplo muestra un comando en el que el cambio de los derechos de acceso se refiere recursivamente a subdirectorios y archivos dentro de una carpeta:
$ chmod -R 744 carpetaXYZ
Para todos los archivos y subcarpetas en la carpetaXYZ, se aplican los siguientes permisos: el propietario recibe derechos de acceso completos (7), los miembros del grupo y los demás usuarios solo tienen permisos de lectura (4).
chmod en la práctica
Veremos a continuación a chmod en acción con un caso práctico, pero, antes de comenzar, revisaremos qué derechos se han otorgado ya. En sistemas Linux/Unix, esto se hace con ayuda del comando Is, que mostrará el contenido del directorio al que hemos llamado tras su ejecución. Si lo completamos con el parámetro -I, responde con una lista de los archivos.
ls -l
La respuesta de la terminal a este comando, el cual, como hemos dicho, se utiliza a modo de ejemplo, podría parecerse a algo así:
total 3
-rwx------ 1 det det 0 2020-02-02 10:41 archivo1.txt
-rw-rw-r-- 1 det det 0 2020-02-02 10:41 archivo2.txt
drwxr-xr-x 2 det det 4096 2020-02-02 10:44 directorio
La ruta que hemos consultado contiene dos archivos (archivo1.txt y archivo2.txt) y un directorio. Cada entrada comienza con un bloque compuesto por 10 caracteres, de gran interés en este caso, porque nos da información sobre los derechos de acceso a los archivos y al directorio que existen hasta ahora:
La cifra en primera posición indica de qué se trata. En el caso de un archivo simple, en este lugar encontraremos un signo menos (como vemos en las dos primeras líneas). La “d” de directory hace referencia a los directorios. Si hubiera un enlace, aquí encontraríamos una “l” de link.
A continuación, siguen los tres bloques decisivos, cada uno con tres caracteres, que informan sobre los permisos asignados en la actualidad. Aquí se sigue la secuencia propia del modo octal: el bloque 1 para el propietario, el bloque 2 para la clase grupo, y el bloque 3 para el resto de usuarios. En el seno de los bloques, la secuencia también se repite:
- La primera posición indica si tiene derecho de lectura (-r);
- la segunda, derecho de escritura (w),
- y, atendiendo al tercer carácter de un bloque, queda patente si esta clase tiene derechos de ejecución (x).
Definida la letra, quedan fijados los permisos. Si no se definen, la posición queda ocupada por un signo menos. Para nuestros archivos y nuestro directorio, los permisos quedan como muestran estas tablas:
archivo1.txt
Propietario | Grupo | Otros usuarios | |
Leer | x | x | |
Escribir | x | x | |
Ejecutar | x | x |
archivo2.txt
Propietario | Grupo | Otros usuarios | |
Leer | |||
Escribir | x | ||
Ejecutar | x | x | x |
directorio
Propietario | Grupo | Otros usuarios | |
Leer | |||
Escribir | x | x | |
Ejecutar |
Agregar permisos con chmod
En un primer caso de uso, asignaremos derechos de lectura y ejecución para todas las clases de usuarios del archivo1.txt, hasta ahora reservados al propietario. Utilizaremos para ello el comando chmod en modo simbólico:
chmod a+rx archivo1.txt
Todas las clases (a) obtienen así nuevos derechos (+) para el documento archivo1.txt, en concreto, permiso para leerlo (r) y ejecutarlo (x).
Si solicitamos una lista de los derechos que hemos otorgado, esta sería la entrada para archivo1.txt:
-rwxr-xr-x 1 det det 0 2020-02-02 10:41 archivo1.txt
Retirar permisos con chmod
En nuestra segunda demostración práctica, queremos retirar el derecho de escritura a todos los usuarios (también al propietario y a la clase grupo) para archivo2.txt. El comando que tendríamos que escribir en la consola sería (en el modo carácter):
chmod a-w archivo2.txt
En este ejemplo, el comando se refiere también a todas las clases (a). Con (-) se retira el derecho de escritura (w) en el archivo2.txt a todos los usuarios. La entrada del archivo en la consola quedaría entonces así:
-r--r--r-- 1 det det 0 2020-02-02 10:41 archivo2.txt