# Referencia Rápida de chmod

*Permisos de archivo, modos numérico y simbólico, bits especiales, umask*

> Source: chmod(1) Manual Page · MIT

## Modo Numérico

### Dígitos Octal de Permisos

| Command | Description |
|---------|-------------|
| `4` | Lectura (r) |
| `2` | Escritura (w) |
| `1` | Ejecución (x) |
| `0` | Sin permiso |

### Formato de Tres Dígitos

```
chmod 755 file    # rwxr-xr-x
chmod 644 file    # rw-r--r--
chmod 700 file    # rwx------
chmod 600 file    # rw-------
```

### Cálculo de Dígitos

| Command | Description |
|---------|-------------|
| `7 (4+2+1)` | rwx — lectura, escritura, ejecución |
| `6 (4+2)` | rw- — lectura, escritura |
| `5 (4+1)` | r-x — lectura, ejecución |
| `4` | r-- — solo lectura |
| `3 (2+1)` | -wx — escritura, ejecución |
| `2` | -w- — solo escritura |
| `1` | --x — solo ejecución |
| `0` | --- — sin permisos |

## Modo Simbólico

### Sintaxis: [ugoa][+-=][rwxXst]

| Command | Description |
|---------|-------------|
| `u` | Usuario (propietario) |
| `g` | Grupo |
| `o` | Otros |
| `a` | Todos (u + g + o) |
| `+` | Agregar permiso |
| `-` | Quitar permiso |
| `=` | Establecer permiso exacto |

### Ejemplos Simbólicos

```
chmod u+x file         # propietario: agregar ejecución
chmod g-w file         # grupo: quitar escritura
chmod o=r file         # otros: solo lectura
chmod a+r file         # todos: agregar lectura
chmod u+x,g-w,o= file # operaciones combinadas
```

## Permisos Comunes

### Presets de Permisos de Archivo

| Command | Description |
|---------|-------------|
| `644  rw-r--r--` | Archivo estándar — propietario rw, otros lectura |
| `755  rwxr-xr-x` | Script / binario — propietario rwx, otros rx |
| `600  rw-------` | Archivo privado — solo propietario |
| `400  r--------` | Solo lectura privada (claves SSH) |
| `666  rw-rw-rw-` | Archivo escribible por todos (evitar) |
| `777  rwxrwxrwx` | Acceso total para todos (evitar) |

### Referencia Rápida

```
chmod 644 *.html       # web: propietario rw, mundo r
chmod 755 *.sh         # scripts: propietario rwx, mundo rx
chmod 600 ~/.ssh/id_*  # claves SSH: solo propietario
chmod 400 secret.pem   # certificado: solo lectura
```

## Permisos de Directorio

### Qué Significan los Permisos en Directorios

| Command | Description |
|---------|-------------|
| `r (4)` | Listar contenido del directorio (`ls`) |
| `w (2)` | Crear / eliminar archivos en el directorio |
| `x (1)` | Acceder (entrar con cd) al directorio |
| `rx (5)` | Listar + acceder (lectura típica) |
| `rwx (7)` | Control total |

### Permisos Comunes de Directorio

```
chmod 755 dir/     # estándar: propietario rwx, otros rx
chmod 700 dir/     # privado: solo propietario
chmod 750 dir/     # acceso grupo: propietario rwx, grupo rx
chmod 1777 /tmp    # sticky bit: solo propietario puede eliminar
```

## Bits Especiales

### Setuid, Setgid, Sticky

| Command | Description |
|---------|-------------|
| `Setuid (4xxx)` | Ejecutar como propietario del archivo (ej., `passwd`) |
| `Setgid (2xxx)` | Ejecutar como grupo del archivo / heredar grupo del dir |
| `Sticky (1xxx)` | Solo el propietario puede eliminar archivos (ej., `/tmp`) |

### Establecer Bits Especiales

```
chmod 4755 program     # setuid: -rwsr-xr-x
chmod 2755 dir/        # setgid: drwxr-sr-x
chmod 1755 dir/        # sticky: drwxr-xr-t
chmod u+s program      # setuid simbólico
chmod g+s dir/         # setgid simbólico
chmod +t dir/          # sticky bit simbólico
```

## Recursivo

### Cambios Recursivos de Permisos

```
chmod -R 755 dir/           # establecer todo a 755 recursivamente
chmod -R u+rwX dir/         # propietario rw, +x solo en dirs
chmod -R go-w dir/          # quitar escritura de grupo/otros
```

### Archivos vs Directorios con find

```
# establecer directorios a 755, archivos a 644
find /path -type d -exec chmod 755 {} +
find /path -type f -exec chmod 644 {} +
```

### X Mayúscula — Ejecución Condicional

| Command | Description |
|---------|-------------|
| `x (minúscula)` | Agregar ejecución a todos los archivos y dirs |
| `X (mayúscula)` | Agregar ejecución solo a dirs y archivos ya ejecutables |

## umask

### Cómo Funciona umask

| Command | Description |
|---------|-------------|
| `umask` | Mostrar umask actual |
| `umask 022` | Archivos: 644, Dirs: 755 |
| `umask 077` | Archivos: 600, Dirs: 700 |
| `umask 002` | Archivos: 664, Dirs: 775 |

### Cálculo de umask

```
# permiso por defecto menos umask = efectivo
# Files:  666 - 022 = 644 (rw-r--r--)
# Dirs:   777 - 022 = 755 (rwxr-xr-x)
umask          # mostrar umask actual
umask 022      # valor típico por defecto
umask -S       # mostrar en notación simbólica
```

## Patrones Comunes

### Casos de Uso Cotidianos

| Command | Description |
|---------|-------------|
| `Raíz web` | `chmod -R 755 /var/www/html` |
| `Archivo de config` | `chmod 600 app.conf` |
| `Directorio SSH` | `chmod 700 ~/.ssh` |
| `SSH authorized_keys` | `chmod 600 ~/.ssh/authorized_keys` |
| `Directorio compartido` | `chmod 2775 /shared` (setgid) |
| `Archivos de log` | `chmod 640 /var/log/app.log` |
| `Scripts cron` | `chmod 755 /etc/cron.daily/myjob` |
| `Directorio temporal` | `chmod 1777 /tmp` (sticky) |

### Ver Permisos

```
ls -l file.txt       # mostrar permisos
ls -ld dir/          # mostrar permisos de directorio
stat -c '%A %a %n' * # simbólico + numérico + nombre
getfacl file.txt     # mostrar ACLs (si se usan)
```
