Para brindar algo de privacidad y protección cada archivo o directorio tiene asociados permisos diferentes para el propietario, para el grupo y para los demás usuarios. En el caso de archivos los permisos que pueden darse o quitarse son: (r) lectura, (w) escritura y (x) ejecución. En el caso de directorios los permisos son: (r) para listar los archivos, (w) para escribir, crear o borrar archivos y (x) para acceder a archivos del directorio. [1].
Desde un administrador de archivos, puede ver los permisos de un archivo con el botón derecho del mouse cuando el puntero está sobre el archivo, escogiendo la opción apropiada del menú que aparece. Desde un intérprete de comandos puede emplear el comando ls con la opción -l. Un ejemplo del resultado de este comando se presenta a continuación:
drwxr-xr-x 5 juan users 4096 Feb 21 06:31 textos -rw-r----- 1 juan users 62561 May 13 18:13 ev.tar.gz lrwxrwxrwx 1 juan users 12 Nov 12 2000 a -> /etc/hosts
La primera línea presenta un directorio (la d al principio de la línea lo indica), la segunda presenta un archivo (el guión inicial lo indica) y la tercera un enlace. El nombre del directorio es textos tiene 5 archivos, fue modificado por última vez el 21 de Febrero del año en curso a las 6:31AM, el propietario es juan, el grupo es users y el tamaño es 4096 bytes. En realidad el tamaño cobra sentido sólo en el caso de archivos como ev.tar.gz cuyo tamaño es 62561 bytes. Los tres caracteres rwx que siguen a la d inicial indican los permisos para el propietario, los tres siguientes r-x indican los permisos para el grupo y los tres siguientes r-x indican los permisos para el resto de usuarios. Como el orden de estos permisos es siempre el mismo (primero lectura r, después escritura w y después ejecución x), resulta que el archivo ev.tar.gz no es ejecutable, que puede ser leído por el propietario y el grupo pero no por los demás usuarios, además puede ser escrito sólo por juan. Del enlace podemos destacar que se llama a, que enlaza al archivo /etc/hosts y que su tamaño y permisos reales los heredará de /etc/hosts.
Los permisos de un archivo pueden ser modificados por el propietario o por el administrador del sistema con el comando chmod que espera dos parámetros: cambio por realizar al permiso y nombre del archivo por cambiar. Los permisos se pueden especificar en octal o con una o más letras para identificar al usuario (u para el usuario, g para el grupo, o para los demás usuarios y a para todos), un +, un - o un = y después letras para identificar los permisos (r, w o x). Por ejemplo:
chmod og+x sube.sh
Da a los demás usuarios y al grupo permiso de ejecución del archivo sube.sh que debe estar en el directorio desde el cual se da el comando.
chmod a-w deu.txt
Quita el permiso de escritura en el archivo deu.txt tanto al propietario, como al grupo, como a los demás usuarios. Este mismo resultado puede obtenerse con el comando chmod -w deu.txt. Cuando no se especifican usuarios chmod toma por defecto todos los usuarios.
chmod u=rxw,g=rx,o= textos
Cambia permisos del archivo (o directorio) textos, el usuario puede leer, ejecutar y escribir, el grupo puede leer y ejecutar mientras que los demás usuarios no tienen permisos.
El propietario de un archivo puede ser modificado sólo por el administrador del sistema con el programa chown. Un usuario que pertenezca a varios grupos puede cambiar el grupo de uno de sus archivos a alguno de los grupos a los que perteneza con el program chgrp, por ejemplo
chgrp estudiantes tarea1.txt
Cambiará el grupo del archivo tarea1.txt a estudiantes. Los grupos a los cuales un usuario pertenece son mostrados por el programa groups.
Contenido |
Uso: chmod {opciones} {nombre de archivo}
| Opciones | Definición |
|---|---|
| #-- | Propietario |
| -#- | Grupo |
| --# | Otros |
| 1 | ejecutar |
| 2 | escribir |
| 4 | leer |
Propietario, Grupo y Otros está representado por tres números. Para obtener el valor de las opciones para determinar el tipo de acceso necesarios para el archivo hay que agregarlos a continuación.
Por ejemplo si deseas que un archivo tenga estos permisos -rw-rw-rwx debes hacer lo siguiente:
| Propietario | Grupo | Otros |
|---|---|---|
| Leer y escribir | leer y escribir | leer, escribir y ejecutar |
| 4 +2 = 6 | 4 +2 = 6 | 4 +2 +1 = 7 |
Usuario @ anfitrión: / home / usuario $ chmod 667 archivo
Otro ejemplo, si quieres que un archivo tenga estos permisos: --w-r-x--x debes utilizar lo siguiente:
| Propietario | Grupo | Otros |
|---|---|---|
| Escribir | leer y ejecutar | ejecutar |
| 2 | 4 +1 = 5 | 1 |
Usuario @ anfitrión: / home / usuario $ chmod 251 archivo
Aquí hay algunos ejemplos de uso de chmod (prueba en tu sistema).
Primero creamos algunos archivos vacíos:
Usuario @ anfitrión: / home / usuario $ touch archivo1 archivo2 archivo3 archivo4 Usuario @ anfitrión: / home / usuario $ ls -l Total de 0 -rw-r--r-- 1 usuario usuario 0 Nov 19 20:13 archivo1 -rw-r--r-- 1 usuario usuario 0 Nov 19 20:13 archivo2 -rw-r--r-- 1 usuario usuario 0 Nov 19 20:13 archivo3 -rw-r--r-- 1 usuario usuario 0 Nov 19 20:13 archivo4
Añadimos permiso de ejecución al propietario
Usuario @ anfitrión: / home / usuario $ chmod 744 archivo1 Usuario @ anfitrión: / home / usuario $ ls -l archivo1 -rwxr--r-- 1 usuario usuario 0 Nov 19 20:13 archivo1
Añadimos a Otros permiso de escritura y ejecución
Usuario @ anfitrión: / home / usuario $ chmod 647 archivo2 Usuario @ anfitrión: / home / usuario $ ls -l archivo2 -rw-r--rwx 1 usuario usuario 0 Nov 19 20:13 archivo2
Eliminamos permiso de lectura al grupo:
Usuario @ anfitrión: / home / usuario $ chmod 604 archivo3 Usuario @ anfitrión: / home / usuario $ ls -l archivo3 -rw----r-- -- 1 usuario usuario 0 Nov 19 20:13 archivo3
Añadimos permiso de lectura, escritura y ejecución a todo el mundo:
Usuario @ anfitrión: / home / usuario $ chmod 777 file4 Usuario @ anfitrión: / home / usuario $ ls -l file4 -rwxrwxrwx 1 usuario usuario 0 Nov 19 20:13 file4 Usuario @ anfitrión: / home / usuario $
utilizamos sudo cuando queremos cambiar los permisos de un archivo del que no somos propietarios (tened cuidado en esta situación pues cualquier metedura de pata puede afectar a partes importantes del sistema)
usuario@host:/home/usuario$ ls -l /usr/local/bin/archivo -rw-r--r-- 1 root root 550 2005-11-13 19:45 /usr/local/bin/archivo usuario@host:/home/ usuario$
usuario@host:/home/ usuario$ sudo chmod o+x /usr/local/bin/archivo
usuario@host:/home/ usuario$ ls -l /usr/local/bin/archivo -rw-r--r-x 1 root root 550 2005-11-13 19:45 /usr/local/bin/archivo usuario@host:/home/ usuario$
Sirve para cambiar permisos de múltiples archivos y directorios con un solo comando. Ten cuidado con el modo recursivo y con el comando sudo
Para cambiar todos los permisos de cada archivo o carpeta bajo un directorio específico de una vez, usa chmod con -R
usuario@host:/home/usuario$ sudo chmod 777 -R /path/to/directorio usuario@host:/home/usuario$ ls -l total 3 -rwxrwxrwx 1usuario usuario 0 Nov 19 20:13 archivo1 drwxrwxrwx 2 usuario usuario 4096 Nov 19 20:13 carpeta -rwxrwxrwx 1 usuariousuario 0 Nov 19 20:13 archivo2
Para asignar permisos con razonable seguridad a archivos y carpetas/directorios, es corriente dar permisos 644 a archivos y 755 a directorios, así chmod -R los asigna a ambos. Usa el comando find y una tubería a chmod como en el siguiente ejemplo
Para cambiar permiso sólo a archivos bajo un directorio específico
usuario@host:/home/usuario$ find /path/to/directorio -type f | while read var1; do sudo chmod 644 $var1; done usuario@host:/home/usuario$ ls -l total 3 -rw-r--r-- 1 usuario usuario 0 Nov 19 20:13 archivo1 drwxrwxrwx 2 usuario usuario 4096 Nov 19 20:13 carpeta -rw-r--r-- 1 usuario usuario 0 Nov 19 20:13 archivo2
Para cambiar sólo los permisos de directorios bajo un directorio específico (incluyendo ese directorio):
usuario@host:/home/usuario$ find /path/to/directorio -type d | while read var1; do sudo chmod 755 $var1; done usuario@host:/home/usuario$ ls -l total 3 -rw-r--r-- 1usuario usuario 0 Nov 19 20:13 archivo1 drwxr--r-- 2 usuario usuario 4096 Nov 19 20:13 carpeta -rw-r--r-- 1 usuario usuario 0 Nov 19 20:13 archivo2
Si accidentalmente cambias los permisos y este comundo no funciona porque find no tiene permiso para leer el directorio específico, pon sudo antes de find
Fuentes: