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
ls -l nombre_archivopara un archivo.ls -ld nombre_directoriopara un directorio.
Consejo
Fíjate en la
ddels -ld. Sin ella,ls -lsobre un directorio te muestra lo que hay dentro, no el directorio en sí. Ladle 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.txtDe 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 archivoCada 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
rwxno cambia nunca, así que la posición te dice de qué permiso se trata:
r--→ solo lecturar-x→ lectura y ejecución, pero no escriturarw-→ 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
Está formado por 3 dígitos, representando de izquierda a derecha los bloques de [usuario][grupo][otros].
Cada número es el resultado de sumar el valor asociado al tipo de permiso:
| 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 entrarY 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 nombreConsejo
Por esto los directorios llevan 755 y los archivos 644. Un directorio sin
xno sirve para nada: no puedes entrar. Si alguna vez te encuentras con un «permission denied» raro al hacercd, mira lax.
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+concede un permiso,-lo quita,=deja exactamente ese y ningún otro.
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 xLa 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 directorioOjo: 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_carpetaPrecaución
Con
-Res fácil hacer un estropicio.chmod -R 777sobre 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 un755, 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 carpetaAviso
chowncasi siempre necesita permisos de administrador, así que se usa consudo(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 sistemaLa 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
sudodelante de algo, léelo dos veces. Consudono 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
sudocon 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 # rootMáscara de permisos
La máscara son los permisos que se le darán por defecto a los archivos y directorios nuevos que crees.
umaska secas muestra la máscara actual.umask 022la cambia.
Precaución
Cambiar la máscara con
umaskes 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:
- 777 para un directorio (
rwxpara todos). - 666 para un archivo. Sin ejecución: dar permiso de ejecución por defecto a todos los archivos sería peligroso.
Si la máscara es 0022:
- El primer dígito son los permisos especiales
(setuid, setgid y sticky bit). Un
0significa «ninguno activado». Los tres dígitos siguientes son los de siempre: usuario, grupo y otros. 0→ al usuario no le quito ningún permiso.2→ al grupo le quito la escritura.2→ a otros les quito la escritura.
Resultado:
- Directorios: de
777quito022→ 755[rwxr-xr-x] - Archivos: de
666quito022→ 644[rw-r--r--]
Aviso
Verás mucho por ahí que la máscara «se resta». No es una resta: es quitar permisos. Con
umask 022el 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ía6 - 7 = -1para el bloque de «otros», que no significa nada. Lo que pasa de verdad es que arw-le quitasrwxy te quedas sin nada, es decir0. 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.txtEjercicios
Crea un archivo y visualiza sus permisos.
Otorga permisos de ejecución solo al propietario en modo simbólico.
Cambia sus permisos a 644.
Elimina los permisos para el grupo.
Haz que solo pueda ejecutarse por el propietario.
Crea una carpeta y dale permisos para que solo el usuario pueda acceder.
Cámbiale el propietario a otro usuario de tu sistema (si existe y tienes permisos).
Consulta la máscara de permisos actual y calcula qué permisos por defecto tendrán los nuevos archivos.
Cambia la máscara, crea un archivo y consulta los permisos por defecto del archivo.
Utiliza un comando como superusuario con
sudo, y comprueba conwhoamila diferencia entre ejecutarlo con y sinsudo.Crea una carpeta con un archivo dentro. Quítale a la carpeta el permiso
xy comprueba qué puedes y qué no puedes hacer: ¿ves el nombre del archivo?, ¿puedes leerlo?, ¿puedes entrar en la carpeta?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?