Ghost AcademySecLearn// Seguridad Informática
🐧 Linux · Comandos de sistema
Comandos Varios I

14 comandos esenciales de Linux: usuarios, historial, localización, diagnóstico avanzado, texto, redes, almacenamiento, procesos y multiplexación de terminal.

who · w history · watch whereis · which · alias at strace · lsof tee · col · fmt · tput · nc diff · patch lscpu · lspci · df · du nohup · rsync screen · tmux
01 who — Quién está conectado
👥 Muestra información básica sobre los usuarios actualmente conectados al sistema: nombre de usuario, terminal, hora de conexión y host remoto.
ComandoDescripción
whoLista nombre de usuario, terminal y hora de conexión
who -rMuestra el nivel de ejecución (runlevel) actual del sistema
who -bMuestra la hora del último arranque (boot) del sistema
bash
who
output
jose     tty7        2025-10-11 09:00 (:0)
otro_usr pts/1       2025-10-11 09:15 (192.168.1.10)
bash
who -r    # nivel de ejecución actual
who -b    # hora del último boot
output
run-level 5  2025-10-11 09:00

Runlevels — Niveles de ejecución

Aunque los sistemas modernos con systemd usan "targets" (ej. graphical.target), who -r sigue reportando el número tradicional. En un VirtualBox con Ubuntu con escritorio, verás el nivel 5.

NivelNombreSignificado
0HaltApagado del sistema
1Single-UserModo mantenimiento — sin red, pocos servicios
2Multi-User (sin GUI)Multiusuario, red activa, sin interfaz gráfica
3Multi-User (sin GUI)Similar al nivel 2 (depende de la distro)
4No UsadoReservado
5Multi-User (con GUI)Modo gráfico multiusuario — escritorio normal
6RebootReinicio del sistema
02 w — Quién está y qué hacen
📊 Como who pero más detallado: añade la carga del sistema (load average) y el proceso activo de cada usuario.
ComandoDescripción
wResumen de carga del sistema y procesos activos de todos los usuarios
w -hOmite la cabecera con información de carga (header)
w joseMuestra información solo del usuario jose
bash
w
w -h jose
output — w
 09:43:05 up 43 min,  2 users,  load average: 0.10, 0.15, 0.12
USER     TTY      FROM            LOGIN@   IDLE JCPU PCPU WHAT
jose     tty7     :0              09:00   43m   0.58s 0.15s /usr/libexec/gnome-terminal
otro_usr pts/1    192.168.1.10   09:15    1m   0.05s 0.02s bash
ℹ️ load average: Los tres valores representan la carga media del sistema en los últimos 1, 5 y 15 minutos. Un valor de 1.0 en un sistema de 1 CPU significa uso completo.
03 history — Historial de comandos
📜 Muestra los comandos ejecutados previamente. Vital para auditar tareas y reutilizar comandos complejos sin tener que reescribirlos.
ComandoDescripción
historyMuestra todo el historial numerado
history 10Muestra solo las últimas 10 entradas
!123Ejecuta el comando número 123 del historial
!lsEjecuta el último comando que empezó con ls
bash
history 5     # ver últimas 5 entradas
!998          # re-ejecutar comando #998
output — history 5
  996  who -r
  997  w -h jose
  998  cat /etc/hosts
  999  pwd
 1000  history 5
04 watch — Ejecutar en bucle
🔁 Ejecuta un comando de forma repetitiva mostrando la salida a pantalla completa. Ideal para monitorizar cambios en tiempo real. Salir con Ctrl+C.
ComandoDescripción
watch <cmd>Ejecuta el comando cada 2 segundos (por defecto)
watch -n 5 <cmd>Ejecuta cada 5 segundos
watch -d <cmd>Resalta los cambios (-d de difference) entre actualizaciones
bash
watch w                              # monitorizar usuarios cada 2s
watch -n 5 -d "cat /proc/loadavg"   # carga del sistema, resaltando cambios
05 whereis — Binario, manual y fuente
🔍 Busca un comando en los directorios estándar del sistema: su binario, código fuente y página de manual.
ComandoDescripción
whereis <cmd>Busca binario, manual y fuente
whereis -b <cmd>Busca solo el binario
whereis -m <cmd>Busca solo la página de manual
bash
whereis bash
whereis -m df
output
bash: /usr/bin/bash /usr/share/man/man1/bash.1.gz
df: /usr/share/man/man1/df.1.gz
06 which — Ruta del ejecutable en $PATH
📍 Busca la ruta completa del ejecutable que se usará cuando escribes el comando, comprobando solo los directorios en $PATH.
ComandoDescripción
which <cmd>Muestra la ruta del primer ejecutable encontrado en $PATH
which -a <cmd>Muestra todas las rutas encontradas en $PATH
bash
which python3
which -a cat
output
/usr/bin/python3

/usr/bin/cat
/bin/cat
ℹ️ whereis vs which: whereis busca en directorios estándar del sistema (binario + man + fuente). which solo busca en tu $PATH actual y devuelve el ejecutable que realmente se usaría.
07 alias / unalias — Atajos
⚡ Crea nombres más cortos o combinaciones de opciones para comandos. Los alias definidos en la terminal son temporales (se pierden al cerrar sesión). Para que sean permanentes, añádelos a ~/.bashrc.
ComandoDescripción
aliasLista todos los alias actualmente definidos
alias nombre='cmd'Crea un nuevo alias temporal
unalias nombreElimina el alias especificado
unalias -aElimina todos los alias del usuario
bash
alias netinfo='ip a'          # crear alias temporal
alias ll='ls -lh'            # ls largo y legible
netinfo                       # usar el alias
unalias netinfo               # eliminar alias
unalias -a                    # eliminar todos
💡 Alias permanentes: Para que un alias persista entre sesiones, añádelo al final de tu ~/.bashrc: echo "alias ll='ls -lh'" >> ~/.bashrc y luego source ~/.bashrc.
08 at — Programar comandos
⏰ Programa un comando para que se ejecute una sola vez en un momento futuro. El resultado se envía al correo del sistema del usuario.
bash — instalación
sudo apt install at
sudo apt install mailutils   # para leer el correo del sistema
mesg y                        # aceptar mensajes en la terminal
ComandoDescripción
at <hora>Entra en modo programación — termina con Ctrl+D
at -l / atqLista trabajos en cola
at -r <n> / atrm <n>Elimina el trabajo número n de la cola
bash — programar un trabajo
at now + 2 minutes
at> echo "¡ÉXITO! Esto se fue al mail"
at> <Ctrl+D para confirmar>

# Verificar y gestionar la cola
atq              # listar trabajos pendientes
atrm 1           # eliminar trabajo #1
output
job 1 at Sat Oct 11 10:48:00 2025

1   Sat Oct 11 10:48:00 2025 a jose

Mostrar resultado directamente en la terminal

El método más fiable es redirigir la salida al dispositivo de tu terminal (obtenido con tty):

bash
tty                           # obtener nombre de tu terminal, ej: /dev/pts/0

at now + 2 minutes
at> echo "¡ÉXITO! MENSAJE MOSTRADO" > /dev/pts/0
at> <Ctrl+D>
bash — leer correo del sistema
mail        # abrir bandeja de entrada
# escribir el número del mensaje y Enter para leerlo
# 'q' para salir
image1.png

// Bandeja de entrada del correo del sistema tras ejecutar at

image2.png

// Contenido del mensaje: stdout del echo + stderr del error de sintaxis

⚠️ write vs wall: at> ... | write jose suele fallar porque atd no puede determinar la sesión del usuario. Usar | wall es más robusto pero también puede bloquearse por restricciones de seguridad de atd. La solución más fiable es redirigir directamente a /dev/pts/N.
09 strace — Rastreo de syscalls
🔬 Intercepta y registra todas las llamadas al sistema (syscalls) que un programa hace al kernel de Linux. Fundamental para depurar y entender el comportamiento interno de un programa.
OpciónDescripción
strace <cmd>Inicia el rastreo del programa especificado
strace -p <PID>Adjunta strace a un proceso ya en ejecución
strace -o <file> <cmd>Guarda la salida del rastreo en un archivo
strace -c <cmd>Cuenta tiempo, llamadas y errores por syscall — resumen tabular
bash
strace ls -l /tmp           # ver syscalls: openat, read, stat, write, close...
strace -c date              # resumen estadístico de syscalls
strace -o trace.log ls      # guardar rastreo en archivo
sudo strace -p 1234         # adjuntar a proceso en ejecución
output — strace -c date
Sun Oct 12 10:00:00 AM CEST 2025
% time   seconds  usecs/call  calls  errors syscall
------  --------  ----------  -----  ------ --------
 90.00  0.000090           3     30         fstat
  ...
------  --------  ----------  -----  ------ --------
100.00  0.000100              150       4   total
10 lsof — Listar archivos abiertos
📂 Lista todos los archivos en uso por procesos activos. En Linux, "archivo" incluye archivos regulares, sockets de red, directorios, librerías y pipes.
OpciónDescripción
lsofLista todos los archivos abiertos (requiere sudo habitualmente)
lsof -iMuestra todos los sockets de red abiertos
lsof -u <user>Archivos abiertos por un usuario
lsof +D <dir>Archivos abiertos dentro de un directorio
sudo lsof -i :22Qué proceso escucha en el puerto 22
bash
lsof -u jose | less         # archivos de jose (puede requerir sudo)
sudo lsof -i :22            # proceso en puerto 22 (SSH)
sudo lsof -i :80            # proceso en puerto 80 (HTTP)
output — sudo lsof -i :22
COMMAND  PID  USER  FD  TYPE  DEVICE  SIZE/OFF  NODE  NAME
sshd    1234  root   3u  IPv4  12345      0t0   TCP   *:ssh (LISTEN)
ℹ️ Sin salida: Si lsof -i :22 no devuelve nada, significa que no hay ningún servicio escuchando activamente en ese puerto.
11 tee — Redirección doble
🔀 Lee stdin y lo escribe simultáneamente a stdout y a uno o más archivos. Permite ver la salida en pantalla y guardarla al mismo tiempo.
ComandoDescripción
cmd | tee archivoEscribe al archivo Y muestra en pantalla
cmd | tee -a archivoAñade al final del archivo existente (-a de append)
bash
ls -l /etc | tee lista_etc.txt                     # ver Y guardar
echo "--- Fin de Sesión ---" | tee -a lista_etc.txt # añadir al log
12 col — Filtro de pipes
🧹 Filtra caracteres de retroceso y caracteres de control de terminales antiguas. Uso principal: limpiar la salida de man antes de guardarla como texto plano.
ComandoDescripción
cmd | col -bElimina retrocesos y espacios especiales (-b de binary), dejando solo texto limpio
bash
man ls | col -b > manual_ls_limpio.txt   # man → texto plano limpio
13 fmt — Reformatear texto
📐 Formateador de texto que ajusta el ancho de línea de un archivo. Útil para README, emails largos o cualquier texto que deba ajustarse a un ancho determinado.
ComandoDescripción
fmt <archivo>Reformatea al ancho por defecto (75 caracteres)
fmt -w <n> <archivo>Establece el ancho máximo de línea en n caracteres
bash
echo "Esta es una frase muy larga que no respeta ningún ancho de línea y se extiende hasta donde le da la gana." > largo.txt
fmt -w 40 largo.txt
output
Esta es una frase muy larga que
no respeta ningún ancho de línea
y se extiende hasta donde le da
la gana.
14 tput — Manipulación de terminal
🎨 Interactúa con la base de datos de capacidades de la terminal (terminfo). Permite mover el cursor, cambiar colores y borrar la pantalla desde scripts.
ComandoDescripción
tput clearBorra la pantalla
tput cup <fila> <col>Mueve el cursor a la posición indicada
tput boldActiva texto en negrita
tput setaf <n>Color de primer plano (0=negro, 1=rojo, 2=verde, 3=amarillo…)
bash
tput clear; tput cup 10 30; tput bold; echo "¡ATENCIÓN!"
tput setaf 2; echo "Texto en verde"; tput sgr0   # sgr0 = reset
15 nc — Netcat: cuchillo suizo de redes
🔌 Lee y escribe datos a través de conexiones de red TCP/UDP. Esencial para pruebas de red, diagnóstico de puertos y transferencia simple de datos.
ComandoDescripción
nc -l -p <puerto>Modo escucha en un puerto específico
nc <host> <puerto>Conectarse a un puerto remoto
nc -zv <host> <puerto>Escanear si un puerto está abierto (-z = zero-I/O)
bash — escaneo de puerto
nc -zv google.com 80
output
Connection to google.com 80 port [tcp/http] succeeded!

Chat simple entre dos terminales

bash — Terminal 1 (escucha)
nc -l -p 8888
bash — Terminal 2 (conecta)
nc localhost 8888
Hola, ¿me oyes?
ℹ️ Lo que escribas en la Terminal 2 aparecerá en la Terminal 1 y viceversa. Es un canal bidireccional de texto en tiempo real.
16 diff — Mostrar diferencias
🔄 Compara dos archivos línea por línea. Fundamental para control de versiones y auditoría de configuraciones. Genera parches en formato unificado aplicables con patch.
ComandoDescripción
diff <f1> <f2>Diferencias en formato estándar
diff -u <f1> <f2>Formato unificado — más legible y compatible con patch
diff -r <dir1> <dir2>Comparar directorios recursivamente
bash — crear archivos de prueba
echo "Linea 1 de codigo" > file_v1.txt
echo "Linea 2 de codigo" >> file_v1.txt
echo "Linea 3 de codigo" >> file_v1.txt

echo "Linea 1 de codigo" > file_v2.txt
echo "Linea 2 de codigo modificado" >> file_v2.txt
echo "Linea 3 de codigo" >> file_v2.txt

diff -u file_v1.txt file_v2.txt > mi_cambio.patch
output — mi_cambio.patch
--- file_v1.txt  2025-10-12 10:00:00 +0200
+++ file_v2.txt  2025-10-12 10:01:00 +0200
@@ -1,3 +1,3 @@
 Linea 1 de codigo
-Linea 2 de codigo
+Linea 2 de codigo modificado
 Linea 3 de codigo
17 patch — Aplicar cambios
🩹 Aplica las diferencias generadas por diff a un archivo, actualizándolo o revirtiendo cambios.
ComandoDescripción
patch <archivo> <patch>Aplica el parche al archivo original
patch -R <archivo> <patch>Revierte los cambios del parche (-R de reverse)
bash
patch file_v1.txt < mi_cambio.patch   # aplicar parche → v1 pasa a ser v2
cat file_v1.txt                        # verificar resultado

patch -R file_v1.txt < mi_cambio.patch # revertir → vuelve a v1
output — tras aplicar el parche
patching file file_v1.txt

Linea 1 de codigo
Linea 2 de codigo modificado
Linea 3 de codigo
18 lscpu — Información de la CPU
ComandoDescripción
lscpuMuestra toda la información de la arquitectura CPU
lscpu -eFormato extendido/tabular — útil para sistemas multi-CPU/multi-núcleo
bash
lscpu
output
Architecture:          x86_64
CPU(s):                8
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
Vendor ID:             GenuineIntel
...
19 lspci — Dispositivos PCI
🖥️ Lista los dispositivos PCI del sistema: tarjetas gráficas, adaptadores de red, controladores USB, etc.
ComandoDescripción
lspciLista todos los dispositivos PCI brevemente
lspci -nnIDs de vendor y device en numérico (útil para buscar drivers)
lspci -kMuestra el módulo del kernel en uso por cada dispositivo
bash
lspci -k
output
01:00.0 VGA compatible controller: NVIDIA Corporation Device 1f08
        Kernel driver in use: nvidia
        Kernel modules: nvidiafb, nouveau, nvidia_drm, nvidia
20 df — Disk Free
ComandoDescripción
dfUso del disco en bloques de 1K
df -hFormato legible por humanos (MB, GB)
df -TIncluye columna de tipo de sistema de archivos (ext4, xfs…)
bash
df -hT
output
Filesystem  Type   Size  Used  Avail  Use%  Mounted on
/dev/sda2   ext4    98G   15G    78G   16%  /
tmpfs       tmpfs  3.9G     0   3.9G    0%  /dev/shm
/dev/sda1   vfat   511M  6.1M   505M    2%  /boot/efi
21 du — Disk Usage
ComandoDescripción
duUso del directorio actual en bloques
du -hFormato legible por humanos
du -sh <dir>Total sumado (-s de summarize) del directorio
bash
du -sh ~/Descargas                  # total de la carpeta
sudo du -h /var/log | sort -h       # subdirectorios ordenados por tamaño
output
4.2G    /home/jose/Descargas

4.0K  /var/log/apt
12K   /var/log/cups
8.1M  /var/log/journal
50M   /var/log
22 nohup — No Hang Up
🔗 Ejecuta un comando ignorando la señal HUP (hangup): el proceso sigue ejecutándose aunque cierres la terminal o te desconectes de SSH. La salida se redirige a nohup.out.
SintaxisDescripción
nohup <cmd> &Ejecuta en segundo plano ignorando HUP. Salida → nohup.out
bash
nohup ./mi_script_largo.sh &
# [1] 12345
# nohup: ignoring input and appending output to 'nohup.out'
# Ahora puedes cerrar la sesión — el script sigue ejecutándose
23 rsync — Sincronización eficiente
🔁 Copia y sincroniza archivos local y remotamente transfiriendo solo las diferencias. Esencial para backups y despliegues. Preserva permisos, timestamps y metadatos.
OpciónDescripción
rsync -av src dstCopia archivada (preserva todo) y verbosa
rsync -avz src dstAñade compresión — útil para redes lentas
rsync --deleteBorra en destino lo que ya no existe en origen — sincronización estricta
rsync --progressMuestra progreso por archivo con velocidad y tiempo restante
bash — local
rsync -av ~/Documentos/ /mnt/backup_drive/documentos_bkp/
bash — remoto via SSH
rsync -avz --progress ~/logs/ jose@servidor01:/var/backups/
ParteSignificadoDetalle
-aArchive modePreserva permisos, propietario, grupo, timestamps y recursividad. Crucial para backups.
-vVerboseLista los archivos que se están transfiriendo
-zCompressComprime datos durante la transferencia — acelera en conexiones lentas
--progressProgressVelocidad y tiempo restante por archivo
~/logs/OrigenLa barra final / sincroniza el contenido de la carpeta, no la carpeta en sí
jose@servidor01:Conexión SSHUsuario y servidor remoto
/var/backups/DestinoDirectorio en el servidor remoto
⚠️ La barra final importa: rsync -av ~/logs/ destino/ copia el contenido de logs/. Sin la barra (~/logs), copia la carpeta logs entera dentro de destino/.
24 screen / tmux — Multiplexores
🖥️ Permiten crear sesiones de terminal persistentes: puedes desconectarte (detach) y reconectarte (reattach) más tarde manteniendo los programas en ejecución. Esenciales para servidores.
ComandoDescripción
screenInicia una nueva sesión de screen
screen -lsLista sesiones abiertas
screen -r <pid>Reataquea la sesión especificada
tmuxInicia una nueva sesión de tmux
tmux lsLista sesiones abiertas
tmux attach-session -t <nombre>Reataquea la sesión por nombre
bash — instalación
sudo apt install screen

Flujo completo con screen

  1. Iniciar una sesión de screen:
    bash
    screen
  2. Ejecutar el comando largo dentro de la sesión:
    bash
    ping google.com
  3. Desconectarse (detach) sin detener el ping: presiona Ctrl+A luego D. Verás: [detached from 12345.pts-0.Ubuntu2404]
  4. Ver sesiones activas:
    bash
    screen -ls
  5. Reconectarse (reattach) para ver cómo sigue el ping:
    bash
    screen -r         # si solo hay una sesión
    screen -r 12345   # si hay varias, especifica el PID
💡 Secuencia de detach: Mantén Ctrl, pulsa A, suelta ambas, luego pulsa D. Si lo haces bien dejarás de ver el ping y volverás al prompt principal.