Coffee bytes

Apuntes de desarrollo web con GNU/Linux, Python y Javascript

Entiende los permisos en GNU/Linux y el comando chmod

El martes, 28 de mayo de 2019

por Eduardo Zepeda

Tiempo de lectura: 5 minutos

La entrada anterior fue la tercera parte sobre la serie de los comandos más comunes de GNU/Linux. Para finalizar la entrada escribí acerca de un comando llamado chmod, que sirve para modificar los permisos de un archivo. Este comando chmod es uno de los comandos un poco más complejos de GNU/Linux, no por su variedad de opciones, sino por los conocimientos previos que se requieren para poder usarlo correctamente.

En esta entrada voy a ampliar un poco el tema de los permisos y mostraré las dos diferentes maneras del comando chmod para asignar permisos a un archivo. Para esta entrada vamos a usar varios comandos básicos de GNU/Linux, si no estás muy familiarizado con los comandos básicos entra aquí donde explico algunos comandos básicos.

Tipos de permisos en GNU/Linux

En GNU/Linux hay 3 tipos de permisos para los archivos; permiso para leer, especificado por la letra ‘r‘; para escribir, representado por la letra ‘w‘; y para ejecutar, asignado a la letra ‘x‘. En Linux todo es un archivo, por lo que lo anterior aplica igualmente a los directorios. Los permisos para los archivos se muestran mediante el comando ‘ls’.

ls -l
-rw-r--r-- 1 usuario usuario 9288 may 14 00:40 helloWorld.out
-rw-r--r-- 1 usuario usuario  106 may 14 00:40 codigo_fuente.cpp

Hay 3 conjuntos de 3 letras, cada conjunto contiene espacios para las letras ‘r‘ ‘w‘ y ‘x‘, en ese orden. La presencia de un guión indica la ausencia de permisos. El primer conjunto representa los permisos del propietario del archivo, el segundo conjunto representa los permisos del grupo al que pertenece el archivo y el tercer conjunto representa los permisos de otros. Antes del primer conjunto hay un espacio para el tipo de archivo; ‘D‘ para directorio, o un guión para un archivo.

Ninguno de los conjuntos tiene permisos para ejecutar el archivo helloWorld.out por lo que, al intentarlo, nos mostrará la frase ‘permiso denegado‘ en la terminal.

./helloWorld.out
--bash: ./helloWorld.out: Permiso denegado

Si removemos los permisos ‘r‘ y ‘w‘ de un archivo, usando el comando chmod, tampoco podremos leer o modificar su contenido, como se ve en las últimas lineas de código que aparecen más abajo.

chmod 000 codigoFuente.cpp
-- # Removemos todos los permisos del archivo codigoFuente.cpp
ls -l
--total 16
------------ 1 usuario usuario  106 may 14 00:40 codigoFuente.cpp
---rwxr-xr-x 1 usuario usuario 9288 may 14 00:40 helloWorld.out
cat codigoFuente.cpp
--cat: codigoFuente.cpp: Permiso denegado
echo "Agrega texto" >> codigoFuente.cpp
--bash: codigoFuente.cpp: Permiso denegado

Agregamos el permiso para ejecutar, ‘x‘, a todos los conjuntos de permisos y ahora el ejecutable puede correrse e imprimir en la terminal la frase ‘Hello world‘. No te preocupes por el significado de los números en el comando chmod, lo explicaremos más adelante.

chmod 755 ejecutable.out
# Asignamos todos los permisos al propietario del archivo y permisos de lectura y ejecución a los demás conjuntos.
ls -l
--total 16
---rw-r--r-- 1 usuario usuario  106 may 14 00:40 codigoFuente.cpp
---rwxr-xr-x 1 usuario usuario 9288 may 14 00:40 helloWorld.out
./helloWorld.out
-- Hello world

¿Qué significan los números en el comando chmod?

Hay 3 cifras en los números que siguen al comando chmod, cada cifra representa los permisos de su conjunto respectivo. El número de cada cifra puede ir del 0 al 7. Este número está determinado por la suma de los valores de cada permiso; 4, 2 y 1.

El permiso ‘r‘ tendrá un valor de 4, el permiso ‘w‘ un valor de 2 y el permiso ‘x‘ un valor de 1.

PermisoValor
Leer4
Escribir2
Ejecutar1

Tomando en cuenta lo anterior, un valor de 7 (4+2+1) significa que cuenta con todos los permisos, un valor de 5 (4 +1) significa que cuenta con el permiso de lectura (r) y de ejecución (x), un valor de 3 (2+1) significan permisos de escritura (w) y ejecución de un archivo (x).

La primera cifra representa los permisos del propietario del archivo, la segunda cifra los permisos del grupo y la tercera cifra los permisos de otros.

Valor del PermisoPermisos para…
755propietario: 4 + 2 +1 = 7 (Leer + Escribir + Ejecutar)
grupo: 4 + 1 = 5 (Leer y ejecutar)
otros: 4 + 1 = 5 (Leer y ejecutar)
777propietario: 4 + 2 +1 = 7 (Leer + Escribir + Ejecutar)
grupo: 4 + 2 +1 = 7 (Leer + Escribir + Ejecutar)
otros: 4 + 2 +1 = 7 (Leer + Escribir + Ejecutar)
111propietario: 1 (Ejecutar)
grupo: 1 (Ejecutar)
otros: 1 (Ejecutar)

Veamos algunos ejemplos del equivalente en permisos de los números.

_rwxrwxrwx
--# Esto seria equivalente al dígito 777
_rwxr_xr_x
--# Esto seria equivalente al dígito 755
___x__x__x
--# Esto seria equivalente al dígito 111

Otro método para asignar permisos con chmod

Hay una manera alternativa de asignar permisos usando el comando chmod que luce más intuitiva. La notación que reemplazará a los 3 dígitos, en el comando chmod, consiste en una o varias letras para especificar los conjuntos a los cuales queremos aplicar los permisos; ‘a’, para todos; ‘u’, para el usuario propietario; ‘g’, para grupo; y ‘o’, para otros.

PermisoSignificado
aTodos
uUsuario
gGrupo
oOtros

Pueden usarse una o varias letras. Después, el símbolo de ‘+’ o ‘-‘, según deseemos agregar o remover permisos, respectivamente. Y, por último, los permisos que queremos agregar o remover, con las letras ‘r‘, ‘w‘ y ‘x‘, para leer, escribir y ejecutar, respectivamente. Veamos algunos ejemplos para clarificarlo.

chmod a+rwx codigoFuente.cpp
---rwxrwxrwx 1 usuario usuario  106 may 14 00:40 codigoFuente.cpp

En el primer ejemplo seleccionamos a todos los conjuntos usando la letra ‘a‘, elegimos agregar permisos usando el simbolo ‘+‘ y especificamos que los permisos a agregar son ‘r‘, ‘w‘ y ‘x‘; lectura, escritura y ejecución, respectivamente.

chmod o-w helloWorld.out
---rwxrwxr-x 1 usuario usuario  106 may 14 00:40 codigoFuente.cpp

Para el segundo ejemplo elegimos que los cambios lo haremos al conjunto otros, seleccionamos el signo ‘-‘, para remover permisos, y declaramos que el permiso a remover es el de escritura, ‘w’.

chmod ug-wx codigoFuente.cpp
---r--r--r-x 1 usuario usuario  106 may 14 00:40 codigoFuente.cpp

Y, por último, en el tercer ejemplo los conjuntos para el propietario y el grupo, ‘g’ y ‘u’, respectivamente, perderán los derechos de escritura y ejecución, ‘w’ y ‘x’.

Esta sintaxis puede ser más intuitiva que la anterior. Ciertamente ya depende del gusto y las preferencias personales de cada quien cual usar, de cualquier manera puedes llegar a los mismos resultados usando cualquiera de las dos.

Si quieres seguir aprendiendo más sobre estos temas puedes suscribirte para que te avise cada vez que publique una entrada nueva, tienes mi promesa de cero spam. Entra aquí para que no te pierdas ningún tip.

¿Quieres aprender más?

Sígueme en Twitter y te aviso cuando tenga nuevo contenido disponible. ¡Es gratis!

¿Te pareció útil esta información?

Recibe más contenido como este en tu correo electrónico. Suscríbete, te toma unos segundos, es gratis, y puedes cancelar cuando quieras

* Campo obligatorio