detomas.net Curso de Bash desde cero
Descargar PDF

Curso de Bash desde cero / Capítulo 6

Administración del sistema

En Unix y Linux, cada archivo y cada directorio lleva pegada una lista de permisos que dice quién puede leerlo, modificarlo o ejecutarlo. Es la base de la seguridad del sistema, y también el motivo de la mitad de los «permission denied» que te vas a encontrar.

Tipos de permiso

Hay tres permisos, y cada uno se puede escribir de dos formas: con una letra (modo simbólico) o con un número (modo octal).

Permiso Letra Número
Lectura r (read) 4
Escritura w (write) 2
Ejecución x (execute) 1

Los números no son arbitrarios: son 4, 2 y 1 precisamente para que cada combinación dé una suma distinta. Así, un solo dígito del 0 al 7 describe sin ambigüedad cualquier mezcla de los tres permisos.

Tipos de usuario

Los permisos se dan por separado a tres grupos de gente:

Letra Quién es
u user: el propietario del archivo
g group: el grupo al que pertenece el archivo
o others: todos los demás
a all: los tres anteriores a la vez

Ver permisos

Consejo

Fíjate en la d de ls -ld. Sin ella, ls -l sobre un directorio te muestra lo que hay dentro, no el directorio en sí. La d le dice «no entres, háblame de la carpeta».

Cómo se lee una línea de ls -l

-rw-r--r-- 1 nica nica 5 Jul 30 15:10 notas.txt

De izquierda a derecha:

Trozo Qué es
-rw-r--r-- Tipo de archivo y permisos
1 Número de enlaces
nica Propietario
nica Grupo
5 Tamaño en bytes
Jul 30 15:10 Fecha de última modificación
notas.txt Nombre

Para ver el tamaño en unidades legibles, añade -h: ls -lh.

Anatomía de los permisos

Modo simbólico

Ese primer trozo, -rwxrwxrwx, son en realidad cuatro bloques pegados:

-   rwx   rwx   rwx
│    │     │     └── otros
│    │     └──────── grupo
│    └────────────── propietario
└─────────────────── tipo de archivo

Cada bloque de tres dice, siempre en ese orden, si hay permiso de lectura, de escritura y de ejecución.

Aviso

Cuando un permiso no está concedido, en su sitio aparece un guion. El orden rwx no cambia nunca, así que la posición te dice de qué permiso se trata:

  • r-- → solo lectura
  • r-x → lectura y ejecución, pero no escritura
  • rw- → lectura y escritura, pero no ejecución

Aviso

La ausencia de un permiso (permiso no otorgado) se representa con -.

Ejemplos: r– indicará que solo tiene permisos de lectura, en cambio, r-x indicará que tiene permisos de lectura y ejecución. Siempre se conserva el orden rwx.

Modo octal

777

Número Suma Permisos Se ve como
7 4 + 2 + 1 lectura + escritura + ejecución rwx
6 4 + 2 lectura + escritura rw-
5 4 + 1 lectura + ejecución r-x
4 4 solo lectura r--
3 2 + 1 escritura + ejecución -wx
2 2 solo escritura -w-
1 1 solo ejecución --x
0 ninguno ---

Así, 777 quiere decir que todo el mundo puede hacer de todo.

Y 764 significa que el propietario lo puede todo (4+2+1 = 7), el grupo puede leer y escribir (4+2 = 6), y los demás solo leer (4).

Consejo

Los dos valores que verás el 90% de las veces son 644 para archivos (rw-r--r--: el dueño edita, los demás solo leen) y 755 para directorios y scripts (rwxr-xr-x: el dueño lo puede todo, los demás entran y leen).

Tipos de archivo más habituales

Es el primer carácter de la línea, antes de los permisos:

Carácter Qué es
- archivo normal
d directorio
l enlace simbólico
b dispositivo de bloque (un disco)
c dispositivo de carácter (un terminal)
s socket
p tubería con nombre (pipe)

Los permisos en directorios significan otra cosa

Esta es la parte que más confunde, y casi nunca se explica: r, w y x no quieren decir lo mismo en un archivo que en una carpeta.

Permiso En un archivo En un directorio
r ver su contenido listar los nombres que contiene
w modificarlo crear y borrar archivos dentro
x ejecutarlo como programa entrar (cd) y acceder a lo de dentro

Lo raro es la x: en una carpeta no significa «ejecutar», significa atravesar. Sin ella no puedes entrar ni leer nada de lo que hay dentro, aunque sepas cómo se llama.

Se ve mejor probándolo. Con un directorio que tiene r pero no x:

mkdir sinx && echo "secreto" > sinx/dato.txt
chmod 600 sinx          # rw- : lectura y escritura, pero sin x

ls sinx                 # dato.txt          <- sí veo el nombre
cat sinx/dato.txt       # Permission denied  <- pero no puedo leerlo
cd sinx                 # Permission denied  <- ni entrar

Y al revés, con x pero sin r:

mkdir solox && echo "dato" > solox/fichero.txt
chmod 100 solox         # --x : solo atravesar

ls solox                # Permission denied  <- no puedo listar
cat solox/fichero.txt   # dato               <- pero sí leer, si sé el nombre

Consejo

Por esto los directorios llevan 755 y los archivos 644. Un directorio sin x no sirve para nada: no puedes entrar. Si alguna vez te encuentras con un «permission denied» raro al hacer cd, mira la x.

Modificación de permisos

Se usa el comando chmod (change mode).

Modo simbólico

Se dice a quién, qué se hace y qué permiso:

chmod [quién][+ - =][permiso] archivo
chmod u+x script.sh      # el propietario ya puede ejecutarlo
chmod u-x script.sh      # se lo quitamos otra vez
chmod go-w notas.txt     # grupo y otros dejan de poder escribir
chmod a+r notas.txt      # todo el mundo puede leerlo
chmod u=rw notas.txt     # el propietario tiene EXACTAMENTE rw, sin x

La ventaja de esta forma es que solo toca lo que le dices; el resto de permisos se queda como estaba.

Modo octal

Aquí se dan los tres bloques de golpe, con un dígito cada uno:

chmod 753 archivo    # u=rwx  g=r-x  o=-wx
chmod 642 archivo    # u=rw-  g=r--  o=-w-
chmod 644 notas.txt  # lo normal para un archivo
chmod 755 script.sh  # lo normal para un script o un directorio

Ojo: el modo octal reescribe los tres bloques enteros. No sirve para retocar un permiso suelto sin tocar los demás.

Cambiar permisos a toda una carpeta

La opción -R (recursiva) aplica el cambio al directorio y a todo lo que tiene dentro:

chmod -R 755 mi_carpeta

Precaución

Con -R es fácil hacer un estropicio. chmod -R 777 sobre una carpeta deja que cualquier usuario del sistema modifique o borre todo lo que hay dentro. Es una mala idea aunque lo veas recomendado en foros para «arreglar» un permission denied: casi siempre lo que hacía falta era un 755, o cambiar el propietario.

Cambiar propietario y grupo

Se usa chown (change owner):

chown nica notas.txt          # cambia el propietario
chown nica:desarrollo notas.txt   # cambia propietario y grupo
chown -R nica mi_carpeta      # a toda una carpeta

Aviso

chown casi siempre necesita permisos de administrador, así que se usa con sudo (lo tienes explicado justo debajo). Tiene sentido: si cualquiera pudiera regalar sus archivos a otro usuario, o quedarse con los ajenos, los permisos no servirían de nada.

El superusuario: root y sudo

Hay tareas que un usuario normal no puede hacer: instalar programas, tocar la configuración del sistema o cambiar el propietario de un archivo. Para eso existe root, el usuario administrador, que se salta todos los permisos.

Trabajar siempre como root es peligroso: no hay red de seguridad, y un comando mal escrito puede cargarse el sistema. Lo normal es trabajar como usuario corriente y pedir permisos de administrador solo para el comando que lo necesita, con sudo:

sudo apt update              # actualizar la lista de paquetes
sudo chown nica notas.txt    # cambiar el propietario de un archivo
sudo nano /etc/hosts         # editar un archivo del sistema

La primera vez te pedirá tu propia contraseña (no la de root), y durante unos minutos no te la volverá a pedir.

Precaución

Antes de poner sudo delante de algo, léelo dos veces. Con sudo no hay confirmaciones ni papelera: el sistema da por hecho que sabes lo que haces.

Y desconfía de cualquier página que te diga que pegues un sudo con un comando largo que no entiendes. Es la forma más habitual de que alguien te reviente el equipo.

Para ver qué usuario eres en cada momento:

whoami        # nica
sudo whoami   # root

Máscara de permisos

La máscara son los permisos que se le darán por defecto a los archivos y directorios nuevos que crees.

Precaución

Cambiar la máscara con umask es temporal: solo afecta a la terminal en la que lo escribes. Al cerrarla, se pierde.

Para que sea permanente hay que añadir la línea a tu ~/.bashrc, igual que con las variables de entorno.

Cómo se calculan los permisos con la máscara

La máscara indica qué permisos hay que quitar a los permisos de partida que el sistema daría a lo nuevo que crees.

Los permisos de partida son:

Si la máscara es 0022:

Resultado:

Aviso

Verás mucho por ahí que la máscara «se resta». No es una resta: es quitar permisos. Con umask 022 el resultado coincide con una resta y por eso cuela, pero se rompe en cuanto la máscara pide quitar un permiso que no estaba puesto.

Pruébalo: con umask 027, la resta diría 6 - 7 = -1 para el bloque de «otros», que no significa nada. Lo que pasa de verdad es que a rw- le quitas rwx y te quedas sin nada, es decir 0. El archivo sale con permisos 640, no con un número negativo.

Compruébalo tú en la terminal:

# Los paréntesis lanzan una subshell: así la máscara no se te queda puesta
(umask 027; touch prueba.txt; stat -c '%a %n' prueba.txt)
# 640 prueba.txt

Ejercicios

  1. Crea un archivo y visualiza sus permisos.

  2. Otorga permisos de ejecución solo al propietario en modo simbólico.

  3. Cambia sus permisos a 644.

  4. Elimina los permisos para el grupo.

  5. Haz que solo pueda ejecutarse por el propietario.

  6. Crea una carpeta y dale permisos para que solo el usuario pueda acceder.

  7. Cámbiale el propietario a otro usuario de tu sistema (si existe y tienes permisos).

  8. Consulta la máscara de permisos actual y calcula qué permisos por defecto tendrán los nuevos archivos.

  9. Cambia la máscara, crea un archivo y consulta los permisos por defecto del archivo.

  10. Utiliza un comando como superusuario con sudo, y comprueba con whoami la diferencia entre ejecutarlo con y sin sudo.

  11. Crea una carpeta con un archivo dentro. Quítale a la carpeta el permiso x y comprueba qué puedes y qué no puedes hacer: ¿ves el nombre del archivo?, ¿puedes leerlo?, ¿puedes entrar en la carpeta?

  12. Mira los permisos de tu propio directorio personal con ls -ld ~ e interpreta lo que ves: ¿quién es el propietario?, ¿puede entrar alguien más?