Para el usuario común de GNU/Linux no necesariamente resulta evidente el proceso detrás del acceso a archivos y directorios. Sin embargo existen tres niveles de permisos para acceder a ficheros: permisos del usuario propietario, permisos de grupos de usuarios y permisos para todos los usuarios del sistema; y a su vez, 3 tipos básicos de permisos: lectura, escritura y ejecución.
Un saludo a la comunidad de Aprender con Libertad, quienes leyeron mi entrada anterior recordarán que de los comandos que deje como bonus, en un par de ellos mencione que simplemente daría una introducción pues requerían una explicación más profunda. En esta publicación veremos uno de esos comandos.
Antes de continuar, si no tienes conocimiento sobre el funcionamiento de la terminal de GNU/Linux, te invito a leer mi introducciona a dicha terminal en este blog.
Analizando permisos
Comencemos por lo más básico: para conocer los permisos de los ficheros que contenga un directorio, debemos generar una lista detallada de los mismos. Para esto usaremos el comando ls con la opción -l.
Digamos que necesitas revisar los permisos de todos los archivos y directorios que se encuentran en tu carpeta personal.
Accede a la terminal de GNU/Linux a través de Aplicaciones -> Accesorios -> Terminal, realizando una búsqueda en tu menú de inicio o mas facil aun, con el atajo de teclado Ctrl + Alt + T.
Ahora ingresa el comando:
ls -l ~
Para quien no lo sabe, el simbolo ~ es un comodin de la terminal de GNU/Linux que hace referencia a la carpeta del usuario actual, es decir que utilizando dicho comodín, haces referencia a la ruta /home/usuario/ donde usuario es el nombre de tu carpeta personal (generalmente tu nombre de usuario). El equivalente largo del comando anterior sería:
ls -l /home/usuario/
El resultado sería una lista con todos los archivos y directorios, más sus permisos, usuarios y otros datos. Cualquier ítem de esa lista tendrá un aspecto como este:
-rw-r--r-- 1 usuario grupo 0 2017-08-02 13:08 archivo.txt
Para alguien inexperto o inexperta, puede parecer chino, pero es más simple de lo que parece. El resultado de la lista se divide en 8 columnas que nos brindan información de cada fichero.
- la primera columna (donde aparece -rw-r--r--) nos habla de los permisos que tiene el archivo (lectura, escritura y ejecución).
- Donde aparece el numero 1, hace referencia a los enlace del fichero.
- Luego tenemos el usuario propietario del fichero.
- El grupo de usuarios al que pertenece el usuario propietario.
- El tamaño.
- Fecha
- Hora
- Y por último, el nombre del fichero.
También puedes ver los permisos de un archivo específico con ls, de la siguiente manera:
ls -l /ruta/al/archivo.extensión
Te mostrara la misma informacion dividida en 8 columnas pero solo del archivo especificado.
Estructura de permisos
En los sistemas GNU/Linux existen 3 tipos básicos de permisos para nuestros ficheros: Lectura, escritura y ejecución.
Permiso de lectura (read): Si tienes permiso de lectura, puedes ver el contenido de un fichero.
Permiso de escritura (write): El permiso de escritura te permite modificar el contenido de un fichero, es decir, editar, sobre escribir e incluso eliminar el archivo.
Permiso de ejecución (execute): Un archivo con este permiso es interpretado por el sistema como un programa.
Ahora presta atención a la primera columna de la lista de resultados, la que en el ejemplo anterior tiene la estructura -rw-r--r--, que es la que nos compete por ahora.
Como puedes ver, el resultado de cada ítem en dicha columna consta de diez espacios de caracteres y estos sirven para definir el tipo de fichero y los tipos de permisos (lectura escritura y ejecución) en grupos de 3, para usuarios propietarios, grupos y otros.
Tipos de ficheros
El primer espacio de caracteres sirve para ver el tipo de archivo y puede contener alguno de los siguientes caracteres:
Guión (-): Indica un archivo común (txt, html, mpr, jpg, etc…).
d: De directory o directorio.
l: De link o enlace, por ejemplo un enlace simbólico conocido en los bajos fondos (Windows) como acceso directo.
b: de binary o binario, puede ser un ejecutable.
Usuarios, grupos, otros
rwx rwx rwx
Como ya dije, los nueve espacios restantes se dividen en grupos de tres y hacen referencia a los tres tipos de permisos que vimos anteriormente, para el usuario propietario, el grupo de usuarios y otros.
Pero quiénes son estos usuarios, grupos y otros?
Lo que daré será solo una definición genérica, algo, como decimos en Venezuela, por encimita. Todo el tema de usuarios y grupos lo dejaremos para otra entrada pero de momento es importante tener presente lo siguiente:
Usuario (u): De user, hace referencia al propietario del fichero.
Grupo (g): De group, hace referencia al grupo de usuarios al que pertenece el usuario propietario.
Otro (o): De other, hace referencia al resto de usuarios del sistema.
Regresando a los espacios de caracteres sobre los permisos, dichos espacios pueden contener:
Guion (-): Cuando no hay permisos de ningún tipo para dicho usuario.
r: De read o lectura.
w: De write o escritura.
x: De execute o ejecución.
Analicemos los permisos del siguiente ítem:
-rwxr-xr-x 1 usuario usuario 459 2017-08-1 13:08 script.sh
El archivo script.sh tiene la siguiente estructura de permisos: -rwxr-xr-x. Pero qué quiere decir esto? Desglosemos y analicemos:
Tipo de archivo: (-) Archivo común.
Permisos para el usuario propietario: (rwx) Lectura, escritura y ejecución.
Permisos para el grupo: (r-x) Lectura y ejecución.
Permisos para otros: (r-x) Lectura y ejecución.
Permisos en formato numérico octal:
Muy bello todo lo que hemos visto, pero llegado este punto, probablemente te preguntes, Y cómo se supone que agrego, elimino y/o modifico los permisos? Si es asi, no te preocupes, vamos por buen camino. La estructura de permisos puede resultar un poco compleja al comienzo por eso es necesario tener bases sólidas, ya casi llegamos al punto central de la entrada.
Ya sabemos que hay 3 tipos de permisos y tres niveles a los que se les asignan: r, w, x en u, g y o. Atencion aqui que esto es algo complejo XD. A cada permiso en cada grupo se le asigna un valor formando toda la combinación un grupo de tres numeros octales.
Octales?
Si, en base a 8 dígitos, del 0 al 7. Más información en Wikipedia…
Continuemos. Cada permiso (rwx) es un bit y cada uno de esos bits tiene su valor:
bit x: 2e0 = 1
bit w: 2e1 = 2
bit r: 2e2 = 4
Entonces x = 1, w = 2, y r = 4. En el caso de un guión (-) el valor es 0.
Estos números resultantes, al ser utilizados en un grupo (rwx), forman un sistema octal del 0 al 7; veamos cómo:
--- = 0 Recuerda que guión (-) = 0 entonces 0 + 0 + 0 = 0, es decir no posee ningún permiso.
--x = 1. Si - = 0 y x = 1, entonces 0 + 0 + 1 = 1. Tiene permiso de ejecución
-w- = 2. Tiene permiso de escritura.
-wx = 3 Tiene permisos de escritura y ejecución.
r-- = 4 Tiene permiso de lectura
r-x = 5 Tiene permisos de lectura y ejecución
rw- = 6 Tiene permisos de lectura y escritura
rwx = 7 Tiene todos los permisos.
Ahora bien, si combinamos los permisos en los niveles usuario propietario, grupo y otros obtenemos un grupo de tres octales. Veamos algunos ejemplos:
rw------- = 600 El propietario tiene permiso de lectura y escritura y el grupo y los demás no tienen ningún tipo de permiso.
Por qué? De nuevo desglosemos y analicemos.
son tres nivles: usuario, grupo, otros y hay 9 espacios de caracteres, es decir, grupos de 3.
rw- --- ---
En el primer nivel tenemos: r = 4, w = 2 y - = 0, por lo tanto rw- = 4 + 2 + 0 = 6 y para los dos niveles siguiente --- = 0 por lo tanto tenemos 6, 0 y 0 o lo que es lo mismo: 600.
Más ejemplos:
rwxrw-r-- = 764. El propietario tiene todos los permisos, el grupo tiene permisos de lectura y escritura y los demás tienen permiso de lectura solamente.
rwxr-xr-x 755. El propietario tiene todos los permisos mientras el grupo y los demás solo tienen permiso de lectura y ejecución.
rwxrwxrwx 777. Todos tienen todos los permisos.
Estableciendo permisos
Si has llegado hasta aquí, bien, porque ahora si, vamos a la acción. Para manejar permisos en GNU/Linux a través de la terminal, tenemos el código chmod que ya vimos de manera breve en comandos básicos en la terminal de GNU/Linux.
Recordemos que su sintaxis básica es chmod -opción <permisos> fichero donde <permisos> nos permite aplicar toda la teoría extraña que acabamos de ver :)
Existen dos maneras de aplicar permisos utilizando chmod. Una es de manera simbólica, y la otra con el sistema octal. veamos cada una de ellas.
Estableciendo permisos de manera simbólica
Ya que conocemos los bits r, w y x que nos permiten definir el permiso y los bits u, g y o que hacen referencia a los 3 niveles (usuario, grupo y otros) ya podemos fácilmente establecer permisos de manera simbólica teniendo en cuenta los siguientes bits:
bit a: De all, o todos. Hace referencia a los tres niveles (usuario, grupo, otros).
bit -: En este caso sirve para quitar permisos
bit +: Añade permisos.
De esta forma nuestra sintaxis para establecer permisos de manera simbólica sería chmod -opción <nivel> +|- <permiso> fichero :) lo se, lo se, para algunos y algunas debe ser más confuso ahora que antes, por lo tanto vamos a verlo mejor en un ejemplo práctico.
Digamos que tienes tu archivo arepa.sh, tu script que abre una receta de arepas venezolanas en una nueva ventana de Firefox; en tu directorio de usuario (/home/usuario/) y por default tiene solo permisos de lectura y escritura para user (usuario propietario) y lectura para group y other y tu quieres darle permisos de ejecución para todos los niveles para que pueda ser ejecutado por cualquier usuario del sistema, entonces
chmod a+x arepa.sh
asi de facil si revisas sus permisos obtendrás -rwxr-xr-x. Una vez más desglosemos y analicemos.
- rwx r-x r-x
El primer - corresponde al tipo de fichero, en este caso, común.
Luego tenemos los 3 grupos, correspondientes a los niveles user, group y other (recuerda que el bit a corresponde a los 3 niveles) y los tres tipos de permisos.
Grupo uno: rwx, 7 en octal. Indica que user tiene todos los permisos.
Grupo dos: r-x, 5 en octal. Indica que group tiene permisos de lectura y ejecución.
Grupo 3: r-x, 5 en octal. Exactamente lo mismo que el anterior, aplicado a other o lo que es lo mismo, a todos los usuarios del sistema.
Ahora digamos que ya no quieres que cualquier usuario pueda ejecutar tu script, arepa.sh. solo user y group, entonces:
chmod o-x arepa.sh
Fácil no? pero que si tienes un archivo gatitos.sh que contiene tu script para abrir en una lista de reproducción de YouTube sobre gatitos? y quieres que sea ejecutado solo por user pero editado por group y solo lectura para other pues no quieres que todos sepan de tu afición a los videos de gatitos.
Para esto tenemos el operador = que nos permite asignar permisos de manera simbólica a cualquier nivel.
chmod u=rwx, g=rw, o=r gatitos.sh
Cabe destacar que todas estas formas simbólicas de asignar permisos pueden combinarse, veamos algunos ejemplos.
chmod a+x archivo.txt
chmod go-x archivo.txt
chmod u-x,go+r archivo.txt
chmod u-x,g+r, o=rwx archivo.txt
Estableciendo permisos con el sistema octal
Si, toda esa teoría loca de sistemas octales y grupos de 3 en 3 que forman series de 0 a 7 sirve para algo :) Nada en GNU/Linux esta hecho por capricho. chmod nos brinda una manera, en mi opinión mucho más fácil y rápida para asignar permisos utilizando el sistema octal que vimos hace un rato. Comencemos por el final, un ejemplo:
chmod 775 script.sh
el resultado seria rwxrwxr-x. Esto es lo mismo que hacer:
chmod a+x script.sh
O darle permisos de ejecución a los tres niveles (user, group, other).
Siempre que logres entender bien cómo funcionan los octales, este método te ahorrará mucho tiempo, por lo tanto desglosemos y analicemos por última vez este ejemplo tomando el cuenta el resultado rwxrwxr-x.
Tenemos tres niveles:
user rwx: r = 4, w =2 y x = 1, por lo tanto rwx = 4 + 2 + 1 = 7.
group rwx: Exactamente lo mismo que el anterior.
other r-x: r = 4, - = 0 y x = 1, es decir: r-x = 4 + 0 + 1 = 5.
Aunque parezca complejo no lo es, al familiarizarte con los octales y el número que le corresponde a cada bit, la cuenta mental será automática y como ya dije, ahorraras tiempo a la hora de establecer permisos en la terminal de GNU/Linux.
Y qué sucede con los directorios
Todo lo que vimos lo aplicamos a archivos, pero por supuesto que aplica a directorios, tanto el sistema octal como la asignación simbólica, el único detalle es que los permisos no se establecen de manera recursiva automáticamente, es decir que si le aplicas un permiso a un directorio, estos no aplican automáticamente al contenido del mismo.
Qué hacer entonces? chmod nos da la opción -R o --recursive que nos permite asignarle permisos de forma recursiva a un directorio, asignando así el mismo permiso a todos los hijos del mismo. Veamos un ejemplo:
Tienes tu directorio de wordpress en tu servidor local y quieres darle permisos de ejecución a los tres niveles pero a su vez que estos permisos se apliquen recursivamente a todos sus directorios y archivos hijos, entonces:
chmod -R 777 /var/www/html/wordpress/
Con esto obtendremos rwx para los tres niveles, es decir todos los permisos para user, group y other.
El tema de permisos en GNU/Linux puede resultar algo complejo de entrada, pero la verdad es bastante simple una vez lo entiendes, así que cero frustración si no lo captas a la primera, como todo en esta vida, manejar GNU/Linux desde la terminal requiere tiempo pero es gratificante una vez logras hacerlo.
Espero que les sirva de algo toda esta informacion, si se me paso algo, quieres aportar o corregirme en algo que me haya equivocado, déjame saberlo en los comentarios y por favor comparte esta entrada en tus redes para que hagamos llegar el conocimiento a más personas.