Índice del contenido

Entiende los permisos en GNU Linux y el comando chmod

Entiende los permisos en GNU Linux y el comando chmod

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 del comando chmod, que gestiona los permisos . 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.

Significado de los permisos en un sistema GNU/Linux

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.

Permiso Valor
Leer 4
Escribir 2
Ejecutar 1

Significado de los números en los permisos GNU/Linux

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 Permiso Permisos para…
755 propietario: 4 + 2 +1 = 7 (Leer + Escribir + Ejecutar) grupo: 4 + 1 = 5 (Leer y ejecutar) otros: 4 + 1 = 5 (Leer y ejecutar)
777 propietario: 4 + 2 +1 = 7 (Leer + Escribir + Ejecutar) grupo: 4 + 2 +1 = 7 (Leer + Escribir + Ejecutar) otros: 4 + 2 +1 = 7 (Leer + Escribir + Ejecutar)
111 propietario: 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.

Permiso Significado
a Todos
u Usuario
g Grupo
o Otros

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. ¿Cuál usar? la que te resulte más sencilla de entender, puedes llegar a los mismos resultados usando cualquiera de las dos.

Eduardo Zepeda
Desarrollador web, entusiasta de los sistemas GNU/Linux y el Software Libre. Py, Ts y Go, pero abierto a otras opciones como el Rustaceanismo. Creo en las bondades de las criptodivisas más allá de la especulación monetaria.
Leer más