Volver al índice
root@vps-donweb:~/docs/cmd$

Comandos Generales

shell bash
editores nano · vim
categoría Sistema
LISTAR ls y tree
# Listar con detalles
ls -la              # todo, incluyendo ocultos, con permisos
ls -lh              # tamaños legibles (K, M, G)
ls -lt              # ordenado por fecha de modificación
ls -lS              # ordenado por tamaño
ls -lR              # recursivo
ls -la /var/www/

# Árbol de directorios
tree                # apt install tree
tree -L 2           # solo 2 niveles de profundidad
tree -h             # con tamaños
tree -a             # incluir ocultos
tree /etc/nginx/
NAVEGAR Moverse entre directorios
cd /var/www/mi-app    # ir a ruta absoluta
cd ../                # subir un nivel
cd ../../             # subir dos niveles
cd ~                  # ir al home del usuario
cd -                  # volver al directorio anterior
pwd                   # mostrar directorio actual

# Historial de directorios
pushd /var/log        # ir y guardar en pila
popd                  # volver al anterior de la pila
dirs                  # ver la pila
CREAR Crear archivos y directorios
# Crear directorio
mkdir mi-carpeta
mkdir -p /var/www/mi-app/public   # crear toda la ruta
mkdir -p carpeta/{css,js,img}     # múltiples subcarpetas

# Crear archivo vacío / actualizar timestamp
touch archivo.txt
touch archivo1.txt archivo2.txt

# Crear archivo con contenido
echo "contenido" > archivo.txt      # sobreescribe
echo "más líneas" >> archivo.txt     # agrega al final

# Crear archivo multilínea
cat > archivo.txt << 'EOF'
línea 1
línea 2
línea 3
EOF
COPIAR / MOVER cp y mv
# Copiar archivo
cp origen.txt destino.txt
cp origen.txt /var/www/
cp -v origen.txt destino.txt       # verbose
cp -p origen.txt destino.txt       # preservar permisos y timestamps

# Copiar directorio completo
cp -r carpeta/ /var/www/destino/
cp -a carpeta/ /var/www/destino/   # preservar todo (como rsync)

# Mover / renombrar
mv archivo.txt nuevo-nombre.txt
mv archivo.txt /var/www/
mv carpeta/ /var/www/nueva-ruta/
mv -i origen destino              # pedir confirmación si existe

# Renombrar múltiples archivos con rename
rename 's/.html/.htm/' *.html      # apt install rename
ELIMINAR rm y rmdir
# Eliminar archivo
rm archivo.txt
rm -f archivo.txt                  # forzar sin confirmación
rm -i archivo.txt                  # pedir confirmación

# Eliminar directorio
rmdir carpeta-vacia/               # solo si está vacío
rm -r carpeta/                     # recursivo
rm -rf carpeta/                    # recursivo y forzado

# Eliminar con patrón
rm *.log
rm -f /var/log/nginx/*.gz

# Buscar y eliminar
find /tmp -name "*.tmp" -delete
find /var/log -name "*.gz" -mtime +30 -delete

rm -rf es irreversible y no tiene papelera. Siempre verificar la ruta antes de ejecutar.

BUSCAR find y locate
# Buscar por nombre
find / -name "nginx.conf"
find /var/www -name "*.php"
find . -name "*.env" -type f

# Buscar por tipo
find /etc -type f      # solo archivos
find /etc -type d      # solo directorios
find /etc -type l      # solo enlaces simbólicos

# Buscar por tamaño
find /var -size +100M   # archivos mayores a 100MB
find /tmp -size -1k     # archivos menores a 1KB

# Buscar por fecha de modificación
find /var/www -mtime -1    # modificados en las últimas 24hs
find /var/log -mtime +30   # no modificados en 30+ días

# Buscar y ejecutar acción
find /var/www -name "*.log" -exec rm {} \;
find . -name "*.php" -exec grep -l "eval(" {} \;

# locate — búsqueda en base de datos indexada (más rápido)
locate nginx.conf
updatedb   # actualizar la base antes de buscar

# Buscar texto dentro de archivos
grep -r "DB_PASSWORD" /var/www/
grep -rl "eval(" /var/www/   # solo nombres de archivos con coincidencia
CHMOD Cambiar permisos
# Notación octal
# 4=lectura(r)  2=escritura(w)  1=ejecución(x)
# usuario | grupo | otros

chmod 755 script.sh     # rwxr-xr-x — ejecutable público
chmod 644 archivo.txt   # rw-r--r--  — archivo público
chmod 600 .env          # rw-------  — solo el dueño
chmod 700 ~/.ssh        # rwx------  — directorio privado
chmod 777 carpeta/      # rwxrwxrwx  — todos pueden todo (evitar)

# Notación simbólica
chmod +x script.sh      # agregar ejecución a todos
chmod u+x script.sh     # agregar ejecución solo al dueño
chmod g-w archivo.txt   # quitar escritura al grupo
chmod o-rwx privado/    # quitar todo a otros
chmod a+r publico.html  # agregar lectura a todos

# Recursivo
chmod -R 755 /var/www/mi-app/
chmod -R 644 /var/www/mi-app/public/

# Permisos recomendados para web
find /var/www/mi-app -type d -exec chmod 755 {} \;
find /var/www/mi-app -type f -exec chmod 644 {} \;
chmod +x /var/www/mi-app/artisan   # archivos ejecutables
CHOWN Cambiar dueño y grupo
# Cambiar dueño
chown www-data archivo.txt
chown mi-usuario:mi-grupo archivo.txt
chown -R www-data:www-data /var/www/mi-app/

# Solo cambiar grupo
chgrp www-data archivo.txt
chgrp -R webdev /var/www/mi-app/

# Ver dueño y permisos actuales
ls -la archivo.txt
stat archivo.txt

# Configuración típica para Nginx + PHP-FPM
chown -R www-data:www-data /var/www/mi-app/
find /var/www/mi-app -type d -exec chmod 755 {} \;
find /var/www/mi-app -type f -exec chmod 644 {} \;
chmod -R 775 /var/www/mi-app/storage/     # Laravel
chmod -R 775 /var/www/mi-app/bootstrap/cache/
ESPECIALES Bits especiales: SUID, SGID, Sticky
# SUID (4) — el archivo se ejecuta con permisos del dueño
chmod u+s ejecutable
chmod 4755 ejecutable
# Aparece como: rwsr-xr-x

# SGID (2) — en directorios: archivos nuevos heredan el grupo
chmod g+s /var/www/mi-app/
chmod 2755 /var/www/mi-app/
# Útil para directorios compartidos entre Nginx y usuarios

# Sticky bit (1) — en directorios: solo el dueño puede borrar sus archivos
chmod +t /tmp
chmod 1777 /tmp
# Aparece como: rwxrwxrwt

# Buscar archivos con SUID activo (auditoría de seguridad)
find / -perm -4000 -type f 2>/dev/null
ENLACES Simbólicos vs duros
ENLACE SIMBÓLICO (symlink / soft link)
  → Apunta a la ruta del archivo original
  → Si el original se borra, el link queda roto
  → Puede cruzar sistemas de archivos y particiones
  → Puede apuntar a directorios
  → ls -la muestra: link -> /ruta/original

ENLACE DURO (hard link)
  → Apunta directamente al inodo del archivo
  → El archivo persiste mientras exista al menos un link
  → Solo funciona en el mismo sistema de archivos
  → No puede apuntar a directorios (excepto root)
  → Indistinguible del archivo original
SYMLINKS Crear y gestionar enlaces simbólicos
# Crear enlace simbólico
ln -s /ruta/original /ruta/enlace

# Ejemplos comunes en el VPS
# Activar sitio en Nginx
ln -s /etc/nginx/sites-available/mi-sitio.conf \
      /etc/nginx/sites-enabled/mi-sitio.conf

# Apuntar una versión de Python
ln -s /usr/bin/python3 /usr/local/bin/python

# Directorio compartido
ln -s /var/datos/uploads /var/www/mi-app/public/uploads

# Verificar enlace
ls -la /etc/nginx/sites-enabled/
readlink /etc/nginx/sites-enabled/mi-sitio.conf
readlink -f enlace         # ruta absoluta del destino real

# Verificar si un enlace está roto
file enlace
test -L enlace && echo "es symlink"
test -e enlace && echo "el destino existe" || echo "enlace roto"

# Encontrar todos los symlinks rotos
find /etc/nginx/sites-enabled -xtype l
find / -xtype l 2>/dev/null

# Eliminar enlace simbólico (NO usar rm -r)
rm /etc/nginx/sites-enabled/mi-sitio.conf
unlink /etc/nginx/sites-enabled/mi-sitio.conf

# Reemplazar enlace existente
ln -sf /nueva/ruta/original /ruta/enlace   # -f fuerza sobreescritura

Al eliminar un symlink que apunta a un directorio, nunca usar rm -r enlace/ (con la barra) — eliminaría el contenido del directorio original. Usar solo rm enlace o unlink enlace.

HARD LINKS Crear y gestionar enlaces duros
# Crear enlace duro
ln /ruta/original /ruta/enlace-duro

# Ver número de hard links de un archivo
ls -la archivo.txt
# El número después de los permisos es la cantidad de links:
# -rw-r--r-- 2 root root 1024 ...
#             ↑ este 2 indica 2 hard links

# Ver el inodo compartido
ls -i archivo.txt enlace-duro
# Mostrarán el mismo número de inodo

# Encontrar todos los hard links de un archivo
find / -inum $(ls -i archivo.txt | cut -d' ' -f1) 2>/dev/null
SCP Copiar archivos via SSH
# De local → VPS
scp archivo.txt usuario@ip:/var/www/
scp -P 2222 archivo.txt usuario@ip:/var/www/
scp -i ~/.ssh/id_ed25519 archivo.txt usuario@ip:/ruta/

# Directorio completo
scp -r carpeta/ usuario@ip:/var/www/mi-app/

# De VPS → local (pull)
scp usuario@ip:/var/www/archivo.txt ./local/
scp -r usuario@ip:/var/www/mi-app/ ./backup/

# Entre dos servidores remotos (desde tu máquina)
scp usuario@servidor1:/ruta/archivo.txt \
    usuario@servidor2:/ruta/destino/

# Con alias de ~/.ssh/config
scp archivo.txt donweb:/var/www/
scp donweb:/var/log/nginx/access.log ./
RSYNC Sincronización eficiente
# De local → VPS (solo lo que cambió)
rsync -avz carpeta/ usuario@ip:/var/www/mi-app/

# Con opciones de producción
rsync -avz --delete \
  --exclude='.git/' \
  --exclude='node_modules/' \
  --exclude='.env' \
  -e "ssh -p 2222 -i ~/.ssh/id_ed25519" \
  ./dist/ \
  usuario@ip:/var/www/mi-app/public/

# De VPS → local (backup pull)
rsync -avz usuario@ip:/var/www/ ./backup-www/

# Dry run — ver qué va a cambiar sin hacerlo
rsync -avzn carpeta/ usuario@ip:/destino/

# Con progreso
rsync -avz --progress carpeta/ usuario@ip:/destino/

# Solo archivos más nuevos que los del destino
rsync -avzu carpeta/ usuario@ip:/destino/
WGET / CURL Descargar archivos desde el VPS
# wget — descargar archivo
wget https://ejemplo.com/archivo.zip
wget -O nombre.zip https://ejemplo.com/archivo.zip
wget -q https://ejemplo.com/archivo.zip       # silencioso
wget -c https://ejemplo.com/grande.zip        # reanudar descarga
wget -r -np https://ejemplo.com/carpeta/      # recursivo

# curl — más versátil
curl -O https://ejemplo.com/archivo.zip
curl -o nombre.zip https://ejemplo.com/archivo.zip
curl -L https://ejemplo.com/redirect          # seguir redirects
curl -s https://ejemplo.com                   # silencioso
curl -I https://ejemplo.com                   # solo headers
curl -u usuario:pass https://ejemplo.com       # autenticación

# Descomprimir descarga
wget -qO- https://ejemplo.com/script.sh | bash
curl -sL https://deb.nodesource.com/setup_20.x | bash -
SFTP Cliente interactivo para transferencia de archivos
# Conectar
sftp usuario@ip
sftp -P 2222 usuario@ip
sftp -i ~/.ssh/id_ed25519 donweb

# Comandos dentro de la sesión SFTP:
# pwd          → directorio remoto actual
# lpwd         → directorio local actual
# ls           → listar remoto
# lls          → listar local
# cd /ruta     → navegar en remoto
# lcd /ruta    → navegar en local
# get archivo  → descargar del remoto al local
# put archivo  → subir del local al remoto
# mget *.txt   → descargar múltiples
# mput *.txt   → subir múltiples
# mkdir        → crear directorio remoto
# rm           → eliminar archivo remoto
# exit / bye   → desconectar

# Clientes gráficos que usan SFTP:
# FileZilla, Cyberduck, WinSCP, Transmit (macOS)
NANO Abrir y salir
nano archivo.txt               # abrir archivo
nano +50 archivo.txt           # abrir en línea 50
nano -l archivo.txt            # mostrar números de línea
nano -v archivo.txt            # solo lectura
nano /etc/nginx/sites-available/mi-sitio.conf

En Nano, ^ significa Ctrl y M- significa Alt.

AtajoAcción
Ctrl + XSalir (pide guardar si hay cambios)
Ctrl + OGuardar sin salir
Ctrl + SGuardar (nano moderno)
Ctrl + ZSuspender nano (volver con fg)
NANO Navegación y edición
AtajoAcción
Ctrl + F / →Avanzar un carácter
Ctrl + B / ←Retroceder un carácter
Ctrl + A / HomeInicio de línea
Ctrl + E / EndFin de línea
Ctrl + P / ↑Línea anterior
Ctrl + N / ↓Línea siguiente
Ctrl + Y / PgUpPágina anterior
Ctrl + V / PgDnPágina siguiente
Alt + \Ir al principio del archivo
Alt + /Ir al final del archivo
Ctrl + _Ir a línea:columna específica
Ctrl + KCortar línea completa
Ctrl + UPegar línea cortada
Alt + 6Copiar línea
Ctrl + WBuscar texto
Ctrl + \Buscar y reemplazar
Alt + UDeshacer
Alt + ERehacer
Ctrl + GMostrar ayuda
VIM Modos de Vim

Vim tiene modos distintos. El error más frecuente es intentar escribir estando en modo Normal. La tecla Esc siempre vuelve al modo Normal.

MODO NORMAL   → navegación y comandos (modo inicial)
MODO INSERT   → escribir texto        (entrar con i, a, o...)
MODO VISUAL   → seleccionar texto     (entrar con v, V, Ctrl+v)
MODO COMANDO  → comandos :            (entrar con :)
vim archivo.txt         # abrir
vim +50 archivo.txt     # abrir en línea 50
vim -R archivo.txt      # solo lectura
vi archivo.txt          # versión básica (siempre disponible)
VIM Guardar, salir y comandos esenciales
ComandoAcción
:wGuardar
:qSalir (falla si hay cambios)
:wq o :x o ZZGuardar y salir
:q!Salir sin guardar (forzar)
:w !sudo tee %Guardar con sudo (cuando olvidaste abrir con sudo)
uDeshacer
Ctrl + RRehacer
.Repetir último comando
VIM Navegación en modo Normal
TeclaAcción
h j k l← ↓ ↑ → (sin flechas)
0 / ^Inicio de línea / primer carácter no vacío
$Fin de línea
ggIr al principio del archivo
GIr al final del archivo
:50Ir a línea 50
w / bPalabra adelante / atrás
Ctrl + F / BPágina adelante / atrás
%Saltar al paréntesis/llave/corchete opuesto
VIM Edición, búsqueda y selección
Tecla / CmdAcción
i / IInsert antes del cursor / inicio de línea
a / AInsert después del cursor / fin de línea
o / ONueva línea abajo / arriba
ddCortar línea
yyCopiar línea
p / PPegar abajo / arriba
5ddCortar 5 líneas
dw / cwBorrar / cambiar palabra
xBorrar carácter bajo el cursor
v / VSelección por carácter / por línea
Ctrl + vSelección en bloque (columnas)
/textoBuscar hacia adelante
?textoBuscar hacia atrás
n / NSiguiente / anterior coincidencia
:s/viejo/nuevo/gReemplazar en línea actual
:%s/viejo/nuevo/gReemplazar en todo el archivo
:%s/viejo/nuevo/gcReemplazar con confirmación
:set nuMostrar números de línea
:syntax onActivar resaltado de sintaxis
PROCESOS Gestión de procesos
# Ver procesos
ps aux
ps aux | grep nginx
pgrep nginx              # solo los PIDs
pidof nginx

# Matar proceso
kill 1234                # señal TERM (graceful)
kill -9 1234             # señal KILL (forzado)
kill -HUP 1234           # recargar configuración
pkill nginx              # matar por nombre
killall php-fpm8.2

# Prioridad de proceso (nice)
nice -n 10 ./script.sh   # ejecutar con baja prioridad
renice +5 1234           # cambiar prioridad de proceso corriendo

# Ejecutar en background
./script.sh &
nohup ./script.sh &       # sobrevive al cierre de la terminal
jobs                     # ver procesos en background
fg %1                    # traer al foreground
bg %1                    # enviar al background
COMPRESIÓN tar, gzip, zip
# tar + gzip (el más usado)
tar czf archivo.tar.gz carpeta/    # comprimir
tar xzf archivo.tar.gz             # descomprimir
tar tzf archivo.tar.gz             # listar contenido
tar xzf archivo.tar.gz -C /destino/

# tar + bzip2 (mejor compresión, más lento)
tar cjf archivo.tar.bz2 carpeta/
tar xjf archivo.tar.bz2

# gzip directo
gzip archivo.txt           # genera archivo.txt.gz
gunzip archivo.txt.gz
gzip -d archivo.txt.gz

# zip / unzip
zip -r archivo.zip carpeta/
unzip archivo.zip
unzip archivo.zip -d /destino/
unzip -l archivo.zip       # listar sin extraer
RED Diagnóstico de red
# Conectividad
ping ejemplo.com
ping -c 4 8.8.8.8         # solo 4 pings
traceroute ejemplo.com
mtr ejemplo.com           # ping + traceroute combinados

# DNS
dig ejemplo.com
dig ejemplo.com A         # solo registro A
dig ejemplo.com MX        # registros de email
dig @8.8.8.8 ejemplo.com  # usar DNS de Google
nslookup ejemplo.com
host ejemplo.com

# Puertos y conexiones
ss -tulnp                  # puertos escuchando
ss -tnp                    # conexiones TCP activas
nc -zv ejemplo.com 443    # verificar si puerto está abierto
curl -I https://ejemplo.com

# IP del servidor
ip addr show
ip route show
curl ifconfig.me          # IP pública
SISTEMA Información del servidor
# CPU y carga
nproc                      # cantidad de CPUs
lscpu                      # detalles de CPU
uptime                     # tiempo encendido y carga
top
htop

# Memoria
free -h
cat /proc/meminfo

# Disco
df -h
lsblk                      # dispositivos de bloque
du -sh *                   # tamaño de cada elemento

# Sistema operativo
uname -a                   # kernel y arquitectura
cat /etc/os-release        # distribución
lsb_release -a

# Variables de entorno
env                        # todas las variables
echo $PATH
echo $HOME
printenv VARIABLE
SHELL Trucos de productividad en bash
# Historial
history                    # ver historial de comandos
history | grep nginx       # buscar en historial
!50                        # ejecutar el comando #50
!!                         # repetir el último comando
sudo !!                    # repetir último con sudo
Ctrl + R                   # búsqueda interactiva en historial

# Atajos de teclado en terminal
Ctrl + A                   # inicio de línea
Ctrl + E                   # fin de línea
Ctrl + U                   # borrar desde cursor hasta inicio
Ctrl + K                   # borrar desde cursor hasta fin
Ctrl + W                   # borrar palabra anterior
Ctrl + L                   # limpiar pantalla (como clear)
Ctrl + C                   # cancelar comando actual
Ctrl + Z                   # suspender proceso

# Redirección
comando > archivo          # stdout a archivo (sobreescribe)
comando >> archivo         # stdout a archivo (agrega)
comando 2> errores.log     # stderr a archivo
comando > archivo 2>&1     # stdout y stderr al mismo archivo
comando 2>/dev/null        # silenciar errores
comando1 | comando2        # pipe: output de 1 como input de 2

# Expansión de llaves
mkdir -p /var/www/{app1,app2,app3}/public
cp archivo.conf{,.bak}    # backup rápido (genera archivo.conf.bak)
mv archivo.conf{.bak,}    # restaurar backup

# Sustitución de comandos
echo "Hoy es $(date +%Y-%m-%d)"
ARCH=$(uname -m)
ls -la $(which nginx)

# watch — repetir comando cada N segundos
watch -n 2 'df -h'        # actualizar cada 2 segundos
watch -n 1 'ss -tnp | wc -l'

# screen / tmux — sesiones persistentes
screen -S mi-sesion       # nueva sesión
screen -ls                # listar sesiones
screen -r mi-sesion       # reconectar
# Ctrl+A D → desconectar sin cerrar
APT Gestión de paquetes
# Actualizar
apt update                 # actualizar lista de paquetes
apt upgrade                # actualizar paquetes instalados
apt full-upgrade           # actualizar con resolución de deps
apt dist-upgrade

# Instalar / eliminar
apt install nginx
apt install -y nginx       # sin confirmación
apt remove nginx           # eliminar sin borrar config
apt purge nginx            # eliminar con config
apt autoremove             # eliminar dependencias huérfanas

# Buscar
apt search nginx
apt show nginx             # detalles del paquete

# Listar
apt list --installed
apt list --installed | grep nginx
dpkg -l                    # lista completa de paquetes

# Ver qué archivos instaló un paquete
dpkg -L nginx

# Saber a qué paquete pertenece un archivo
dpkg -S /usr/sbin/nginx