1. La línea de comandos
Las herramientas gráficas sirven para tareas puntuales, pero un administrador trabaja con la línea de comandos: es más rápida, funciona por SSH en servidores sin escritorio y, sobre todo, se puede automatizar con scripts. En Linux el intérprete habitual es bash (o zsh); en Windows, PowerShell (el antiguo cmd sigue existiendo).
Gráfico frente a comandos 🖱️⌨️
Anatomía de un comando
1usuario@equipo:~/proyecto$ ls -la --sort=size /etc
2# prompt: usuario, equipo y directorio actual (~ = carpeta personal; $ usuario normal, # root)
3# ls = el comando
4# -la = opciones cortas combinadas (-l formato largo, -a ocultos)
5# --sort = opción larga
6# /etc = argumento
7
8man ls # manual completo ls --help # ayuda breve
9history # comandos anteriores ↑ ↓ # recorrerlos; Tab # autocompletarComandos esenciales (Linux y PowerShell)
| Tarea | Linux (bash) | Windows (PowerShell) |
|---|---|---|
| Directorio actual / cambiar | pwd · cd /etc | Get-Location (pwd) · Set-Location (cd) |
| Listar | ls -lah | Get-ChildItem (ls, dir) |
| Crear carpeta / fichero | mkdir -p a/b · touch f.txt | New-Item -ItemType Directory a · New-Item f.txt |
| Copiar / mover / borrar | cp -r · mv · rm -r | Copy-Item · Move-Item · Remove-Item -Recurse |
| Ver un fichero | cat · less · head -n 5 · tail -f | Get-Content f.txt -Tail 5 -Wait |
| Buscar texto | grep -i error app.log | Select-String error app.log |
| Información del sistema | uname -a · hostnamectl · free -h | Get-ComputerInfo |
| Ayuda | man comando | Get-Help comando -Examples |
Redirecciones y tuberías
1echo "hola" > saludo.txt # la salida va a un fichero (lo sobrescribe)
2echo "adiós" >> saludo.txt # añade al final
3sort < nombres.txt # la entrada viene de un fichero
4comando 2> errores.log # los errores (salida 2) a un fichero
5comando > todo.log 2>&1 # salida y errores juntos
6comando > /dev/null # descartar la salida
7
8# Tubería: la salida de un comando es la entrada del siguiente
9cat /var/log/syslog | grep -i error | wc -l
10ps aux | sort -k4 -rn | head -5 # los 5 procesos que más memoria usan
11cut -d: -f1 /etc/passwd | sort # nombres de usuario ordenados2. Usuarios y grupos
Cada persona debe tener su propia cuenta: así se aplican permisos, se sabe quién hizo qué y se puede dar de baja a alguien sin afectar al resto. Los grupos reúnen usuarios para dar permisos a todos a la vez.
| Fichero (Linux) | Contenido |
|---|---|
/etc/passwd | usuario:x:UID:GID:comentario:home:shell — lectura para todos |
/etc/shadow | Contraseñas cifradas (hash) y caducidad — solo root |
/etc/group | grupo:x:GID:miembros |
/etc/sudoers | Quién puede usar sudo (se edita con visudo) |
- root (UID 0) es el superusuario. No se trabaja como root: se usa
sudopara cada orden que lo necesita. - Los UID bajos (< 1000) son cuentas de sistema para servicios (www-data, mysql); los usuarios personas empiezan en 1000.
- En Windows hay usuarios estándar y administradores (con UAC), cuentas locales o de dominio (Active Directory / Entra ID).
1sudo adduser ana # crear usuario (interactivo; useradd -m -s /bin/bash es la versión baja)
2sudo passwd ana # cambiar su contraseña
3sudo groupadd desarrollo # crear grupo
4sudo usermod -aG desarrollo,sudo ana # añadir a grupos (-a = sin quitarle los que tiene)
5id ana # uid, gid y grupos
6sudo chage -M 90 ana # la contraseña caduca a los 90 días
7sudo usermod -L ana # bloquear la cuenta
8sudo deluser --remove-home ana # borrar usuario y su carpeta
9who; last # quién está conectado / últimos accesos1New-LocalUser -Name "ana" -FullName "Ana García" -Password (Read-Host -AsSecureString)
2Add-LocalGroupMember -Group "Administradores" -Member "ana"
3Get-LocalUser; Get-LocalGroupMember "Usuarios"
4Disable-LocalUser -Name "ana"
5# Símbolo del sistema: net user ana /add · net localgroup Administradores ana /add
6# Gráfico: lusrmgr.msc (Usuarios y grupos locales)3. Permisos
En Linux cada fichero tiene un propietario, un grupo y tres juegos de permisos: para el propietario (u), para el grupo (g) y para el resto (o). Cada juego tiene lectura (r=4), escritura (w=2) y ejecución (x=1), y se suman: rwx = 7, r-x = 5, r-- = 4.
1$ ls -l
2-rwxr-x--- 1 ana desarrollo 2048 sep 30 10:00 despliegue.sh
3drwxr-xr-x 2 ana ana 4096 sep 30 09:12 publico
4# │└┬┘└┬┘└┬┘ └┬┘ └───┬───┘
5# │ u g o dueño grupo
6# └ tipo: - fichero, d directorio, l enlace
7
8chmod 750 despliegue.sh # rwx r-x ---
9chmod u+x,g-w,o= script.sh # notación simbólica: añadir, quitar, fijar
10chmod -R g+rw proyecto/ # recursivo
11sudo chown ana:desarrollo informe.odt
12sudo chgrp desarrollo proyecto/
13umask 027 # permisos que se quitan a lo que se cree (ficheros 640, carpetas 750)| Permiso | En un fichero | En un directorio |
|---|---|---|
| r (4) | Leer el contenido | Listar lo que contiene (ls) |
| w (2) | Modificarlo | Crear, borrar y renombrar ficheros dentro |
| x (1) | Ejecutarlo como programa | Entrar en él (cd) y acceder a sus ficheros |
Permisos especiales y ACL
- SUID (4000): el programa se ejecuta con los permisos de su dueño (por eso
passwdpuede escribir en /etc/shadow). - SGID (2000) en un directorio: lo que se crea dentro hereda el grupo (carpetas de equipo).
- Sticky bit (1000) en un directorio: cada uno solo puede borrar lo suyo (
/tmpesdrwxrwxrwt). - ACL: permisos para usuarios concretos además de u/g/o:
setfacl -m u:luis:rw informe.odt,getfacl informe.odt. - Windows (NTFS): listas de control de acceso con permisos (Control total, Modificar, Leer y ejecutar, Leer, Escribir), herencia y denegaciones explícitas. Se gestionan en Propiedades → Seguridad o con
icacls.
1icacls C:\Proyectos /grant "desarrollo:(OI)(CI)M" # Modificar para el grupo, heredado por carpetas y ficheros
2icacls C:\Proyectos\secreto.txt /inheritance:r /grant ana:R
3icacls C:\Proyectos # ver la ACL4. Procesos, servicios y rendimiento
Un proceso es un programa en ejecución, con su identificador (PID), su usuario, su memoria y su estado. Un servicio (demonio en Linux) es un proceso que funciona en segundo plano sin usuario delante: el servidor web, SSH, la base de datos.
1ps aux | grep nginx # buscar procesos
2top / htop # monitor en tiempo real (q para salir, k para matar)
3pgrep -a java # PID y línea de órdenes
4kill 4321 # pedir que termine (SIGTERM, 15)
5kill -9 4321 # forzar (SIGKILL): último recurso, no deja limpiar
6nice -n 10 ./compilar.sh # arrancar con menos prioridad
7renice -n 5 -p 4321
8./copia.sh & # ejecutar en segundo plano; jobs, fg, bg
9
10# Servicios con systemd
11systemctl status ssh
12sudo systemctl start|stop|restart|reload nginx
13sudo systemctl enable --now nginx # arrancar ahora y en cada inicio
14systemctl list-units --type=service --state=running
15
16# Recursos
17free -h; uptime; vmstat 2; iostat; df -h; ss -tulpn1Get-Process | Sort-Object CPU -Descending | Select-Object -First 5
2Stop-Process -Name notepad -Force
3Get-Service | Where-Object Status -eq Running
4Restart-Service -Name Spooler
5Set-Service -Name wuauserv -StartupType Manual
6# Gráfico: Administrador de tareas (Ctrl+Mayús+Esc), services.msc, Monitor de recursos (resmon), perfmon5. Software, tareas programadas y registros
Gestores de paquetes
| Sistema | Instalar | Actualizar todo | Buscar / quitar |
|---|---|---|---|
| Debian/Ubuntu (apt) | sudo apt install git | sudo apt update && sudo apt upgrade | apt search · apt remove |
| Red Hat/Fedora (dnf) | sudo dnf install git | sudo dnf upgrade | dnf search · dnf remove |
| Windows (winget) | winget install Git.Git | winget upgrade --all | winget search · winget uninstall |
| Universales | snap install · flatpak install | snap refresh | Aislados y con sus dependencias |
Tareas programadas
1crontab -e # editar las tareas del usuario (sudo crontab -e para root)
2# ┌─ minuto (0-59) ┌─ hora (0-23) ┌─ día del mes ┌─ mes ┌─ día de la semana (0 = domingo)
3# m h dom mes dow orden
430 2 * * * /usr/local/bin/copia.sh # todos los días a las 2:30
50 8 * * 1-5 /usr/local/bin/informe.sh # de lunes a viernes a las 8:00
6*/15 * * * * /usr/local/bin/comprobar-web.sh # cada 15 minutos
7@reboot /usr/local/bin/al-arrancar.sh
8# Alternativa moderna: temporizadores de systemd (systemctl list-timers)
9
10# Windows: Programador de tareas (taskschd.msc) o
11schtasks /create /tn "Copia" /tr "C:\scripts\copia.bat" /sc daily /st 02:30Registros (logs)
1journalctl -u ssh --since "1 hour ago" # registros de un servicio
2journalctl -p err -b # errores desde el último arranque
3tail -f /var/log/syslog # seguir el registro en directo
4sudo tail /var/log/auth.log # inicios de sesión, sudo, SSH
5# Windows: Visor de eventos (eventvwr.msc) — Registros de Windows: Aplicación, Seguridad, Sistema
6Get-WinEvent -LogName System -MaxEvents 20 | Where-Object LevelDisplayName -eq "Error"6. Automatizar con scripts
Un script es un fichero de texto con órdenes que se ejecutan en secuencia, con variables, condiciones y bucles. Con ellos se automatizan altas de usuarios, copias, informes o comprobaciones.
1#!/bin/bash
2# Copia comprimida de una carpeta con fecha y rotación (se conservan las 7 últimas)
3set -euo pipefail # parar ante cualquier error
4
5ORIGEN="${1:-/srv/datos}" # primer argumento o valor por defecto
6DESTINO="/mnt/copias"
7FECHA=$(date +%F)
8FICHERO="$DESTINO/datos-$FECHA.tar.gz"
9
10if [ ! -d "$ORIGEN" ]; then
11 echo "No existe $ORIGEN" >&2
12 exit 1
13fi
14
15tar -czf "$FICHERO" -C "$ORIGEN" .
16echo "Copia creada: $FICHERO ($(du -h "$FICHERO" | cut -f1))"
17
18# Borrar las copias antiguas (todas menos las 7 más recientes)
19ls -1t "$DESTINO"/datos-*.tar.gz | tail -n +8 | xargs -r rm --
20
21# chmod +x copia.sh y ./copia.sh /home/ana| Elemento | bash | PowerShell |
|---|---|---|
| Variable | nombre="Ana"; echo "$nombre" | $nombre = "Ana"; $nombre |
| Argumentos | $1 $2 $# $@ | param($Ruta) / $args |
| Leer teclado | read -r x | $x = Read-Host |
| Condición | if [ -f "$f" ]; then … fi | if (Test-Path $f) { … } |
| Comparar números | [ "$a" -gt 5 ] | $a -gt 5 |
| Bucle | for f in *.log; do … done | foreach ($f in Get-ChildItem *.log) { … } |
| Salida del último comando | $? | $? / $LASTEXITCODE |
1# PowerShell: crear usuarios locales a partir de un CSV (nombre,grupo)
2param([string]$Csv = ".\usuarios.csv")
3
4Import-Csv $Csv | ForEach-Object {
5 $clave = ConvertTo-SecureString "Temporal-2025!" -AsPlainText -Force
6 New-LocalUser -Name $_.nombre -Password $clave -PasswordNeverExpires:$false
7 Add-LocalGroupMember -Group $_.grupo -Member $_.nombre
8 Write-Host "Creado $($_.nombre) en $($_.grupo)"
9}Practica aquí mismo
🧪 Retos de bash
Scripts reales ejecutados en un servidor Linux de pruebas. Se comprueban con varios casos de entrada, algunos ocultos.
Lee un nombre por teclado. Si está vacío, muestra «Error: nombre vacío»; si no, muestra «Hola, NOMBRE» y en otra línea «Tu nombre tiene N letras».
Lee un número. Si no es un entero positivo, muestra «Error: número no válido». Si lo es, muestra su tabla del 1 al 10 con el formato «N x i = resultado».
Por la entrada llega un log con líneas «FECHA HORA NIVEL IP mensaje». Muestra: • «Errores: N» (líneas con nivel ERROR) • «Avisos: N» (nivel WARN) • «IP con más errores: IP (N)» con la IP que más aparece en las líneas ERROR.
Por la entrada llega el contenido de un /etc/passwd (campos separados por «:» — usuario:x:UID:GID:comentario:home:shell). Muestra, ordenados por UID, los usuarios «reales» (UID ≥ 1000 y distinto de 65534) con el formato «usuario (UID) -> home [shell]», y al final «Total: N».
Por la entrada llega una lista de nombres de fichero (uno por línea). En un directorio temporal (mktemp -d), crea cada fichero y asígnale permisos: 750 si termina en .sh, 600 si termina en .key y 644 en cualquier otro caso. Después muestra, ordenados por nombre, sus permisos en octal y su nombre con stat -c '%a %n'.
Por la entrada llega la salida de «df -h» (con su cabecera). Muestra «ALERTA: PUNTO_DE_MONTAJE al N%» para cada sistema de ficheros con un uso igual o superior al umbral que se pasa en la primera línea de la entrada, y «Todo correcto» si no hay ninguno.
7. Ejercicios
Permisos de un proyecto compartido
En un servidor Linux, el equipo «web» (ana y luis) trabaja en /srv/web. Configura: 1. El grupo web con ana y luis. 2. /srv/web propiedad de root:web; los del grupo leen y escriben, el resto no ve nada. 3. Todo lo que se cree dentro debe pertenecer al grupo web automáticamente. 4. Nadie puede borrar ficheros de otro miembro. 5. Un usuario «auditor» debe poder leer (solo leer) todo. Escribe los comandos y el resultado esperado de ls -ld /srv/web.
Diagnóstico de un servidor lento
Un servidor Ubuntu responde muy despacio. Describe, paso a paso y con los comandos concretos, cómo averiguarías si el problema es la CPU, la memoria, el disco o un proceso concreto, cómo verías los errores recientes y qué harías si un proceso de copia de seguridad está consumiendo todo el disco en horario de trabajo.
Alta masiva de usuarios
Escribe un script en bash que reciba un fichero CSV (usuario;nombre completo;grupo) y para cada línea: cree el grupo si no existe, cree el usuario con su carpeta personal y shell bash, le asigne una contraseña temporal que deba cambiar en el primer inicio de sesión y lo añada al grupo. Debe ignorar líneas vacías y comentarios (#), no fallar si el usuario ya existe y escribir un resumen al final.