El programa de línea de comandos chmod, abre­via­tu­ra 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 ope­ra­ti­vos tipo Unix mu­l­tiu­sua­rio, chmod sirve para asignar permisos de acceso a carpetas y di­re­c­to­rios en sistemas de archivos co­m­pa­ti­bles con los permisos de archivo típicos de Unix. Esto afecta, por regla general, a todos los sistemas de archivos estándar en las de­ri­va­cio­nes de Linux que más se usan para operar se­r­vi­do­res. Para hacer cualquier mo­di­fi­ca­ción en los atributos de los archivos chmod, es necesario ser pro­pie­ta­rio del archivo o contar con derechos raíz (ad­mi­ni­s­tra­dor).

Linux es una de las opciones más populares entre los ad­mi­ni­s­tra­do­res de se­r­vi­do­res web. En la mayor parte de ellos se instalan di­s­tri­bu­cio­nes de este sistema operativo tipo Unix como, por ejemplo, Ubuntu. Una ca­ra­c­te­rí­s­ti­ca común a todos los derivados Unix es la atri­bu­ción de derechos de acceso a los archivos y di­re­c­to­rios. Los usuarios tienen la po­si­bi­li­dad de ge­s­tio­nar­los im­ple­me­n­ta­n­do 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 fu­n­da­me­n­ta­les: las clases de usuario y los permisos básicos in­di­vi­dua­les. En la gestión de estos permisos, chmod soporta dos modos di­fe­re­n­tes: la notación simbólica con letras (modo simbólico o carácter) y la atri­bu­ción de permisos con códigos octales de cifras (modo octal). Pero, como dijimos arriba, solo el pro­pie­ta­rio 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 re­pre­se­n­ta el modo que se aplicará a file, que podrá ser un archivo o un di­re­c­to­rio. 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 di­re­c­to­rios, cuenta con permisos de acceso propios, que se regulan siempre en base a tres clases de usuarios:

Pro­pie­ta­rio (user) Por lo general, cualquier usuario que crea un archivo en un sistema Unix se define au­to­má­ti­ca­me­n­te como user de ese archivo. Con el comando chown puede mo­di­fi­car­se esta atri­bu­ción a po­s­te­rio­ri.
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 au­to­má­ti­ca, pero también puede pe­r­te­ne­cer a otros grupos. Tanto los pro­pie­ta­rios de los archivos, como los usuarios raíz, pueden co­n­fi­gu­rar la asi­g­na­ció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 pro­pie­ta­rios de archivos ni miembros de un grupo con derechos de acceso.

Para es­ta­ble­cer los permisos, se cuenta, como se dijo antes, con dos modi di­fe­re­n­tes, el simbólico y el octal, que de­ta­lla­re­mos en los párrafos si­guie­n­tes.

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. Co­m­bi­ná­n­do­los, puede definirse muy fá­ci­l­me­n­te qué derechos se han de otorgar o retirar y a qué usuarios. La tabla que verás a co­n­ti­nua­ción recoge los ca­ra­c­te­res uti­li­za­dos en la notación simbólica para usuarios y permisos:

Carácter para permisos Si­g­ni­fi­ca­do
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 Si­g­ni­fi­ca­do
u user, pro­pie­ta­rio
g group, grupo
o other, otros
a all, todas las clases

Si la de­fi­ni­ción de los derechos se hace por el modo simbólico, para vincular las clases de usuario con sus re­s­pe­c­ti­vos permisos se utilizan los si­guie­n­tes ope­ra­do­res:

+ Con el operador “+” se asignan más derechos de archivo a una clase de usuario. Solo se so­bre­s­cri­ben 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 pro­pie­ta­rio (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 si­guie­n­tes derechos en lugar de los an­te­rio­res:

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 uti­li­za­das, su uso frecuente puede hacerla in­ma­ne­ja­ble. Por esta razón, muchos ad­mi­ni­s­tra­do­res 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 re­pre­se­n­ta 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 Si­g­ni­fi­ca­do
1 Co­rre­s­po­n­de a la clase de usuario “pro­pie­ta­rio” (user).
2 Co­rre­s­po­n­de a la clase de usuario “grupo” (group).
3 Co­rre­s­po­n­de 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 re­s­pe­c­ti­vos derechos:

Valor para derechos de acceso Si­g­ni­fi­ca­do
4 Leer
2 Escribir
1 Ejecutar
0 Sin permisos

De aquí podrían surgir las si­guie­n­tes co­m­bi­na­cio­nes 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 re­cu­rri­re­mos a un ejemplo. Si el pro­pie­ta­rio 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

Po­si­cio­na­n­do al valor 6 en primer lugar, el pro­pie­ta­rio se atribuye derechos de lectura (4) y de escritura (2). El segundo valor es­pe­ci­fi­ca los derechos de acceso del grupo: 4 (leer). Para otros usuarios, que ocuparían la tercera posición, no se es­pe­ci­fi­có ningún derecho, in­di­cá­n­do­lo 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 di­s­po­si­ción una amplia gama de opciones en la asi­g­na­ción de derechos de acceso a archivos y di­re­c­to­rios. Estos siempre se in­se­r­ta­rán en la línea de comandos entre el comando y los permisos (o modos).

Código Opción De­s­cri­p­ción
-R recursive El cambio de los derechos de acceso se aplica a todos los archivos y su­b­di­re­c­to­rios dentro de una carpeta.
-v verbose Después del comando se emite un dia­g­nó­s­ti­co de todos los archivos pro­ce­sa­dos.
-c changes Después del comando se muestra un dia­g­nó­s­ti­co para todos los archivos que se han mo­di­fi­ca­do.
-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 re­cu­r­si­va­me­n­te a su­b­di­re­c­to­rios y archivos dentro de una carpeta:

$ chmod -R 744 carpetaXYZ

Para todos los archivos y su­b­ca­r­pe­tas en la ca­r­pe­ta­X­YZ, se aplican los si­guie­n­tes permisos: el pro­pie­ta­rio 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 co­n­ti­nua­ción a chmod en acción con un caso práctico, pero, antes de comenzar, re­vi­sa­re­mos qué derechos se han otorgado ya. En sistemas Linux/Unix, esto se hace con ayuda del comando Is, que mostrará el contenido del di­re­c­to­rio al que hemos llamado tras su ejecución. Si lo co­m­ple­ta­mos 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 co­n­su­l­ta­do contiene dos archivos (archivo1.txt y archivo2.txt) y un di­re­c­to­rio. Cada entrada comienza con un bloque compuesto por 10 ca­ra­c­te­res, de gran interés en este caso, porque nos da in­fo­r­ma­ción sobre los derechos de acceso a los archivos y al di­re­c­to­rio 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 en­co­n­tra­re­mos un signo menos (como vemos en las dos primeras líneas). La “d” de directory hace re­fe­re­n­cia a los di­re­c­to­rios. Si hubiera un enlace, aquí en­co­n­tra­ría­mos una “l” de link.

A co­n­ti­nua­ción, siguen los tres bloques decisivos, cada uno con tres ca­ra­c­te­res, que informan sobre los permisos asignados en la ac­tua­li­dad. Aquí se sigue la secuencia propia del modo octal: el bloque 1 para el pro­pie­ta­rio, 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, ate­n­die­n­do 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 di­re­c­to­rio, los permisos quedan como muestran estas tablas:

archivo1.txt

  Pro­pie­ta­rio Grupo Otros usuarios
Leer ✓ x x
Escribir ✓ x x
Ejecutar ✓ x x

archivo2.txt

  Pro­pie­ta­rio Grupo Otros usuarios
Leer ✓ ✓ ✓
Escribir ✓ ✓ x
Ejecutar x x x

di­re­c­to­rio

  Pro­pie­ta­rio Grupo Otros usuarios
Leer ✓ ✓ ✓
Escribir ✓ x x
Ejecutar ✓ ✓ ✓

Agregar permisos con chmod

En un primer caso de uso, asi­g­na­re­mos derechos de lectura y ejecución para todas las clases de usuarios del archivo1.txt, hasta ahora re­se­r­va­dos al pro­pie­ta­rio. Uti­li­za­re­mos 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 eje­cu­tar­lo (x).

Si so­li­ci­ta­mos 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 de­mo­s­tra­ción práctica, queremos retirar el derecho de escritura a todos los usuarios (también al pro­pie­ta­rio y a la clase grupo) para archivo2.txt. El comando que te­n­dría­mos 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
Ir al menú principal