Apuntes DAM
    Tema 5 de 10SI · 1º DAM/DAW

    Sistemas Informáticos

    Administración de Sistemas Operativos

    Línea de comandos (bash y PowerShell), usuarios y grupos, permisos, procesos y servicios, paquetes, tareas programadas, registros y scripts, con retos de bash reales.

    90 min lecturaIntermedio

    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 🖱️⌨️

    🖱️
    Interfaz gráfica
    Como pedir en un restaurante señalando la carta: fácil, pero una cosa cada vez.
    ⌨️
    Comandos
    Como dar la receta exacta al cocinero: más rápido y repetible si sabes lo que pides.
    📜
    Scripts
    La receta escrita: se ejecuta igual mil veces, en mil equipos, a las tres de la mañana.

    Anatomía de un comando

    terminal
    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  # autocompletar

    Comandos esenciales (Linux y PowerShell)

    TareaLinux (bash)Windows (PowerShell)
    Directorio actual / cambiarpwd · cd /etcGet-Location (pwd) · Set-Location (cd)
    Listarls -lahGet-ChildItem (ls, dir)
    Crear carpeta / ficheromkdir -p a/b · touch f.txtNew-Item -ItemType Directory a · New-Item f.txt
    Copiar / mover / borrarcp -r · mv · rm -rCopy-Item · Move-Item · Remove-Item -Recurse
    Ver un ficherocat · less · head -n 5 · tail -fGet-Content f.txt -Tail 5 -Wait
    Buscar textogrep -i error app.logSelect-String error app.log
    Información del sistemauname -a · hostnamectl · free -hGet-ComputerInfo
    Ayudaman comandoGet-Help comando -Examples

    Redirecciones y tuberías

    terminal
    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 ordenados
    Linux Para Principiantes - Curso completo — DeciLearn
    Como Usar Windows POWERSHELL - Explicado para principiantes — Jose Garcia

    2. 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/passwdusuario:x:UID:GID:comentario:home:shell — lectura para todos
    /etc/shadowContraseñas cifradas (hash) y caducidad — solo root
    /etc/groupgrupo:x:GID:miembros
    /etc/sudoersQuién puede usar sudo (se edita con visudo)
    • root (UID 0) es el superusuario. No se trabaja como root: se usa sudo para 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).
    linux
    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 accesos
    windows-powershell
    1New-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)
    Permisos, usuarios y grupos en Linux. (Administración básica) — WhileTrueThenDream

    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.

    terminal
    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)
    Calculadora de permisos (chmod)
    Propietario (u)Grupo (g)Otros (o)
    Lectura (r=4)
    Escritura (w=2)
    Ejecución (x=1)
    Simbólico (ls -l)
    -rwxr-xr--
    Orden
    chmod 754 fichero.sh
    PermisoEn un ficheroEn un directorio
    r (4)Leer el contenidoListar lo que contiene (ls)
    w (2)ModificarloCrear, borrar y renombrar ficheros dentro
    x (1)Ejecutarlo como programaEntrar 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 passwd puede 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 (/tmp es drwxrwxrwt).
    • 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.
    windows
    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 ACL
    Cómo Funcionan los PERMISOS de LINUX: Explicación FÁCIL! #08 — TheGoodHacker

    4. 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.

    linux
    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 -tulpn
    windows-powershell
    1Get-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), perfmon
    Los Procesos | Curso de Linux 4 | Como monitorearlos y administrarlos, comandos ps top kill y htop — Computadoras y Sensores

    5. Software, tareas programadas y registros

    Gestores de paquetes

    SistemaInstalarActualizar todoBuscar / quitar
    Debian/Ubuntu (apt)sudo apt install gitsudo apt update && sudo apt upgradeapt search · apt remove
    Red Hat/Fedora (dnf)sudo dnf install gitsudo dnf upgradednf search · dnf remove
    Windows (winget)winget install Git.Gitwinget upgrade --allwinget search · winget uninstall
    Universalessnap install · flatpak installsnap refreshAislados y con sus dependencias

    Tareas programadas

    cron
    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:30

    Registros (logs)

    registros
    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.

    copia.sh
    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
    ElementobashPowerShell
    Variablenombre="Ana"; echo "$nombre"$nombre = "Ana"; $nombre
    Argumentos$1 $2 $# $@param($Ruta) / $args
    Leer tecladoread -r x$x = Read-Host
    Condiciónif [ -f "$f" ]; then … fiif (Test-Path $f) { … }
    Comparar números[ "$a" -gt 5 ]$a -gt 5
    Buclefor f in *.log; do … doneforeach ($f in Get-ChildItem *.log) { … }
    Salida del último comando$?$? / $LASTEXITCODE
    altas.ps1
    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

    Los retos siguientes se ejecutan en un bash real en un servidor de pruebas: escribe el script, pulsa Ejecutar o Tests y comprueba la salida con varios casos, algunos ocultos.

    🧪 Retos de bash

    Scripts reales ejecutados en un servidor Linux de pruebas. Se comprueban con varios casos de entrada, algunos ocultos.

    🖥️BashSaludo con validaciónFácil

    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».

    ⏳
    Nombre normal
    ⏳
    Otro nombre
    ⏳
    Test oculto #3
    0/3 tests pasados
    🖥️BashTabla de multiplicar con bucleFácil

    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».

    ⏳
    Tabla del 7
    ⏳
    Texto
    ⏳
    Test oculto #3
    0/3 tests pasados
    🖥️BashAnalizar un fichero de logMedio

    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.

    ⏳
    Log de ejemplo
    ⏳
    Test oculto #2
    0/2 tests pasados
    🖥️BashUsuarios del sistema desde /etc/passwdMedio

    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».

    ⏳
    passwd de ejemplo
    ⏳
    Test oculto #2
    0/2 tests pasados
    🖥️BashCrear ficheros y asignar permisosMedio

    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'.

    ⏳
    Tres tipos
    ⏳
    Test oculto #2
    0/2 tests pasados
    🖥️BashAlerta de espacio en discoDifícil

    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.

    ⏳
    Umbral 80
    ⏳
    Test oculto #2
    0/2 tests pasados
    Curso de BASH SCRIPTING desde CERO para PRINCIPIANTES — El Pingüino de Mario

    7. Ejercicios

    Ejercicio Práctico
    Medio

    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.

    Ejercicio Práctico
    Medio

    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.

    Ejercicio Práctico
    Difícil

    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.

    ¿Has terminado este tema?

    Crea una cuenta gratis para guardar qué temas has terminado, subir de nivel y ganar medallas.

    Guardar mi progreso