linux-chmod-permisos-cambiar-recursive-rwx

Este artículo trata de bajar a tierra algunos del los conceptos base acerca de usuarios, grupos, permisos, archivos y directorios en sistemas operativos de la familia Unix. Ya sea como introducción a usuarios novicios, como a modo de repaso para usuarios más veteranos.

Los sistemas operativos de la familia Unix poseen usuarios y grupos. Cada usuario puede pertenecer a varios grupos, y pertenece al menos a un grupo, llamado grupo principal.

Los usuarios y grupos se utilizan para autenticación y autorización. Cuando un usuario crea un archivo (o un directorio), se convierte automáticamente en el dueño del mismo. Pero además, el grupo principal al que pertenece el usuario también se convierte se convierte en dueño del archivo. Esta relación de pertenencia (uid, gid) se almacena entre la meta información del archivo.

La meta información del archivo es información que posee el sistema de archivos respecto a cada archivo. Esta información no es parte del contenido del archivo, sino que es almacenada y gestionada por el sistema de archivos de diferentes formas (de acuerdo al formato de sistema de archivos (ext2, ext3, ext4, ntfs, zfs, xfs, ufs, etcétera). Entre esta meta información típicamente se encuentra el nombre del archivo, dueño, grupo o grupos dueños del archivo, fechas de creación/modificación, permisos de acceso, y más.

Las acciones típicas sobre archivos y directorios, que requieren autorización (permiso explícito), son: lectura, escritura y ejecución.

El permiso de lectura indica que se puede leer el contenido de un archivo o directorio. Leer el contenido de un directorio significa poder listar su contenido (archivos y subdirectorios). El permiso de escritura indica que se puede modificar el contenido de un archivo o directorio. Modificar un directorio significa poder agregar y eliminar archivos y subdirectorios, o cambiar el nombre de los mismos. El permiso de ejecución significa que es posible ejecutar un archivo. El permiso de ejecución sobre un directorio indica que se puede "atravesar" el directorio.

Es posible ejecutar un archivo siempre que su formato sea conocido. Los sistemas operativos Linux típicamente soportan el formato ejecutable bianrio ELF y todo archivo en formato de texto plano que corresponda con un script (y se indique claramente su intérprete en el hashbang).

El comando file es una buena herramienta para determinar el tipo y formato de un archivo ejecutable:

root@debian:~# file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0x55f1e005df252708d4c456dcc2c7dccea1006553, stripped
root@debian:~# file /usr/sbin/service 
/usr/sbin/service: POSIX shell script, ASCII text executable

Unix gestiona los permisos de acceso a un archivo o directorio a través de tres simples reglas (o modos): permisos para el usuario dueño del archivo/directorio (identificado con la letra u), permisos para el grupo dueño del archivo/directorio (identificado con la letra g), y permisos para el resto del mundo (identificado con la letra o, del inglés others). Estos modos definen si cada una de las partes mencionadas tiene acceso de lectura (r, read), escritura (w, write), y ejecución (x, execute).

En base a esta información es posible confeccionar una tabla y utilizar un bit para cada permiso, el cual valiendo 1 indica que se tiene permiso y valiendo 0 indica que NO se tiene permiso:

  lectura (r) escritura (w) ejecución (x)
usuario (u) 1 1 1
grupo (g) 1 0 1
otros (o) 1 0 0

De esta tabla se observa que:

  • El usuario dueño del archivo tiene permitido el acceso de lectura, escritura y ejecución.
  • El grupo dueño del archivo tiene permitido el acceso de lectura y ejecución.
  • El resto del mundo tiene permitido el acceso de lectura.

Entonces, ¿qué significan los benditos modos en el sistema numérico octal? 755, 644, 400, etcétera.

Veamos esto desde el comienzo. En el principio creó Dios los cielos y la tierra... err. No tan atrás.

Como mencioné anteriormente, los permisos de acceso para usuario, grupo y otros se almacenan en bits que indica si se tiene (1) o no (0) permiso (valga la redundancia) para realizar cada acción sobre el archivo o directorio. Cabe recordar que estos permisos de acceso son parte de la meta información del archivo/directorio, la cual en los sistemas ext2/3/4 se encuentra directamente dentro del inodo.

Un bit es un dígito binario y, como muchos sabemos, un conjunto de ocho bits hacen un byte.

Las computadoras (y dispositivos digitales en general) utilizan el sistema numérico binario porque es muy simple y económico de representar a nivel electrónico. Un dígito binario se representa de forma eficiente y robusta a través de un simple flip-flop (o biestable). No es el objetivo de este artículo ahondar en conceptos electrónicos, pues para explicar qué es un biestable tendría que explicar qué es una compuerta. Para explicar qué es una compuerta tendría que explicar conceptos de técnicas digitales y álgebra de Boole. Y para explicar cómo se implementa una compuerta tendría que explicar qué es un transistor; de qué se trata el campo eléctrico y voltaje; cómo se construye un transistor NPN/PNP; qué es el silicio y seguir profundizando en conceptos teóricos de química, física y matemática.

A partir de este punto vamos a asumir que un biestable es un pequeño dispositivo electrónico que en todo momento puede almacenar sólo uno de dos valores (o estados) posibles: 0 y 1.

Por ende las computadoras trabajan completamente utilizando el sistema numérico binario, basado en dígitos binarios que van del 0 al 1. A diferencia de los humanos, que generalmente trabajamos con el sistema decimal, basado en dígitos decimales que van del 0 al 9.

A su vez el sistema numérico octal es aquel basado en dígitos octales que van del 0 al 7.

De esta forma, los modos octales son una abreviación de los permisos de acceso binarios. El sistema de archivos almacena la tabla mostrada anteriormente en una única fila de 9 dígitos binarios donde los tres primeros corresponden al usuario, los tres del medio corresponden al grupo y los últimos tres al resto del mundo. Siguiendo el ejemplo de la tabla anterior, si el usuario tiene permiso de lectura, escritura y ejecución; el grupo tiene permiso de lectura y ejecución; y el resto tiene permiso de sólo lectura; los bits de acceso quedan almacenados en una única fila, de la siguiente forma:

111101100

Está claro que para nosotros seres humanos (si sos un robot, crawler o spider de Google por favor pasá al siguiente párrafo) esta información es difícil de interpretar. No tanto por su dificultad sino por su poca claridad, son una bola de unos y ceros amontonados. Tal vez sea más simple con un poco de ayuda visual:

 u   g   o
rwx rwx rwx
111 101 100

El problema es que, al listar un directorio, no es conveniente agregar toda esta ayuda visual, pues resulta perjudicial. Es por ello que surge el modo octal para abreviar o sintetizar la misma.

Para entender el modo octal es necesario comprender algunos conceptos básicos sobre sistemas numéricos. Todo sistema numérico tiene una base, la cual indica la cantidad de dígitos diferentes para una posición.

La base del sistema decimal es (presumiblemente) 10, pues existen 10 dígitos diferentes para cada posición, que van del 0 al 9. La base del sistema binario en cambio, es 2, pues existen sólo dos dígitos diferentes: 0 y 1.

Utilizando la base y la posición de cada dígito (posición que va del cero hacia arriba para la parte entera y del menos uno hacia abajo para la parte fraccionaria) es posible descomponer un número decimal de la siguiente forma:

678,9 = 6 * 10^2 + 7 * 10^1 + 8 * 10^0 + 9 * 10^-1

Lo mismo ocurre para descomponer (y convertir a decimal) un número binario:

 111 =           1 * 2^2 + 1 * 2^1 + 1 * 2^0 =     4 + 2 + 1 =  7
 110 =           1 * 2^2 + 1 * 2^1 + 0 * 2^0 =     4 + 2 + 0 =  6
 101 =           1 * 2^2 + 0 * 2^1 + 1 * 2^0 =     4 + 0 + 1 =  5
 100 =           1 * 2^2 + 0 * 2^1 + 0 * 2^0 =     4 + 0 + 0 =  4
 000 =           0 * 2^2 + 0 * 2^1 + 0 * 2^0 =     4 + 0 + 0 =  0
1011 = 1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0 = 8 + 0 + 2 + 1 = 11

Una propiedad interesante de la base octal (aquella que utiliza los dígitos del 0 al 7), es que 3 dígitos binarios codifican exactamente a 1 dígito octal. Esto ocurre porque 8 (octal) es una potencia de 2 (binario):

8 = 2^3

De esta forma es posible agrupar de a tres bits para transformarlos a su correspondiente octal. Así, la configuración de permisos anterior:

111101100

Se transforma en octal de la siguiente forma:

111       101       100
|||       |||       |||
||+–  1   ||+–  1   ||+–  0
|+––  2   |+––  0   |+––  0
+–––  4   +–––  4   +–––  4
     –––       –––       –––
    = 7       = 5       = 4

Lo que resulta en el modo:

754

Gracias al modo octal es posible identificar de manera amigable y eficiente las diferentes configuraciones de permisos:

rwx  4+2+1 = 7   lectura, escritura y ejecución
rw-  4+2+0 = 6   lectura y escritura
r-x  4+0+1 = 5   lectura y ejecución
r--  4+0+0 = 4   sólo lectura
---  0+0+0 = 0   ningún permiso

El sistema de archivos permite todas las combinaciones de permisos posibles, pero hay 3 que raramente se usan o tienen poco o ningún sentido:

-wx  0+2+1 = 3   escritura y ejecución
-w-  0+2+0 = 2   sólo escritura
--x  0+0+1 = 1   sólo ejecución

En los sistemas operativos de la familia Unix, la gestión de permisos se realiza con la utilidad chmod. Esta permite especificar los permisos a aplicar sobre un archivo/directorio de manera octal, sin embargo también cuenta con un modo simbólico, que permite setear los permisos de manera amigable (aunque tal vez un poco más confusa). Cabe destacar que sólo el dueño de un archivo o el superusuario (root) pueden cambiar los permisos de acceso a un archivo o directorio.

El cambio de ownership (cambiar el usuario o grupo dueño de un archivo o directorio) se gestiona a través de la herramienta chwon. Sólo root puede cambiar el dueño (tanto usuario como grupo) de un archivo o directorio.

Además de los bits de modo (permisos de acceso) existen otros bits adicionales como SUID y SGID.

 

Fuente: linuxito

¿Quién está en línea?

Hay 12308 invitados y ningún miembro en línea