32blogby StudioMitsu

Guía completa de wget: descargas, procesamiento por lotes y automatización

Aprende wget desde lo básico hasta uso avanzado: descargas por lotes, reanudación de transferencias, espejado de sitios y scripting.

9 min read
LinuxwgetCLIdownloadautomationcurlscripting
Contenido

Cuando necesitas descargar un archivo desde la línea de comandos — especialmente en un servidor remoto donde no tienes navegador — wget es la herramienta para el trabajo.

Ya sea un solo archivo, un lote de cientos o espejar un sitio web completo, wget lo maneja desde la terminal. Sin necesidad de GUI. Funciona por SSH. Puede ejecutarse en segundo plano, reanudar descargas interrumpidas y ser automatizado mediante scripts.

Esta guía cubre todo, desde lo básico hasta casos de uso reales, con ejemplos listos para ejecutar.

¿Qué es wget?

wget es una utilidad de línea de comandos para descargar archivos a través de HTTP, HTTPS y FTP. Es parte del Proyecto GNU y viene preinstalado en prácticamente todas las distribuciones Linux, y está disponible en macOS vía Homebrew.

Características clave:

  • No interactivo: se ejecuta completamente desatendido, perfecto para scripts y tareas cron
  • Reanudable: continúa donde lo dejaste después de una descarga interrumpida
  • Recursivo: puede rastrear y descargar sitios web completos
  • Compatible con proxy: funciona a través de proxies HTTP
  • Ejecución en segundo plano: desconéctate de la terminal y la descarga continúa

Verificar la instalación

Comprueba que wget está instalado:

bash
wget --version

Si no lo tienes:

bash
# Debian / Ubuntu
sudo apt install wget

# CentOS / RHEL
sudo yum install wget

# Fedora
sudo dnf install wget

# macOS (Homebrew)
brew install wget

Uso básico

Descargar un solo archivo

bash
wget https://example.com/file.zip

El archivo se guarda en el directorio actual. Una barra de progreso muestra la velocidad de descarga, cantidad descargada y tiempo restante estimado.

Especificar el nombre de archivo o directorio de salida

bash
# Guardar con un nombre diferente
wget -O myfile.zip https://example.com/file.zip

# Guardar en un directorio específico
wget -P ~/downloads/ https://example.com/file.zip

# Directorio y nombre personalizados (usar ruta completa con -O)
wget -O ~/downloads/setup.zip https://example.com/file.zip

Ejecutar en segundo plano

Al descargar archivos grandes, desconéctate de la terminal para seguir trabajando:

bash
wget -b https://example.com/largefile.iso

La salida va a wget-log. Monitorea el progreso con:

bash
tail -f wget-log

Referencia de opciones comunes

OpciónQué hace
-O ARCHIVOGuardar como ARCHIVO
-P DIRECTORIOGuardar en el directorio DIRECTORIO
-bModo segundo plano
-cContinuar/reanudar descarga interrumpida
-qModo silencioso (sin salida)
--limit-rate=VELOCIDADLimitar velocidad (ej. --limit-rate=1m)
-rDescarga recursiva
-l PROFUNDIDADEstablecer profundidad de recursión
--no-check-certificateOmitir verificación SSL
-i ARCHIVODescargar URLs listadas en ARCHIVO
--user-agent=STRINGEstablecer User-Agent personalizado
--header=STRINGAñadir cabecera HTTP
-NSolo descargar si es más nuevo que la copia local
--tries=NNúmero de intentos de reintento
--timeout=SEGUNDOSEstablecer timeout de conexión

Casos de uso reales

Descarga por lotes desde una lista de URLs

Crea un archivo de texto con una URL por línea, luego pásalo a wget con -i:

bash
cat > urls.txt << EOF
https://releases.ubuntu.com/24.04.1/ubuntu-24.04.1-desktop-amd64.iso
https://example.com/data/january.csv
https://example.com/data/february.csv
https://example.com/data/march.csv
EOF

wget -i urls.txt -P ~/downloads/

Cada URL se descarga en secuencia. Combina con -b para ejecutar todo el lote en segundo plano.

Reanudar una descarga interrumpida

Si una descarga grande se corta por un problema de red, simplemente añade -c y vuelve a ejecutar el mismo comando:

bash
# Descarga original (interrumpida)
wget https://example.com/bigfile.iso

# Reanudar desde donde se detuvo
wget -c https://example.com/bigfile.iso

wget verifica el tamaño del archivo local y solicita solo los bytes restantes. Si no existe un archivo parcial, empieza de cero.

Limitar la velocidad de descarga

Evita saturar tu conexión o ser limitado por el servidor:

bash
# Limitar a 1 MB/s
wget --limit-rate=1m https://example.com/file.iso

# Limitar a 500 KB/s
wget --limit-rate=500k https://example.com/file.iso

Autenticar con usuario y contraseña

Para HTTP Basic Auth:

bash
wget --user=myusername --password=mypassword https://example.com/protected/file.zip

Las contraseñas en argumentos de comando terminan en el historial del shell. Si eso te preocupa, omite --password y wget te la pedirá interactivamente:

bash
wget --user=myusername https://example.com/protected/file.zip
# pregunta: Password for 'myusername'@example.com:

Para FTP:

bash
wget ftp://ftp.example.com/pub/file.tar.gz
wget --ftp-user=user --ftp-password=pass ftp://ftp.example.com/private/file.tar.gz

Espejar un sitio web completo

Descargar una copia completa de un sitio para visualización offline o archivado:

bash
wget --mirror \
     --convert-links \
     --adjust-extension \
     --page-requisites \
     --no-parent \
     https://example.com/

Qué hace cada flag:

  • --mirror (o -m): descarga recursiva + marcas de tiempo + profundidad infinita
  • --convert-links: reescribe enlaces para que funcionen offline (absolutos → relativos)
  • --adjust-extension: añade .html a páginas que lo necesiten
  • --page-requisites: descarga CSS, imágenes, JS — todo lo necesario para renderizar la página
  • --no-parent: no subir por encima de la ruta especificada

El sitio descargado estará en un directorio con el nombre del dominio.

Solo descargar si el archivo ha cambiado

Consulta una URL y solo descarga cuando la versión del servidor es más nueva que tu copia local:

bash
wget -N https://example.com/data.csv

Esto es genial para mantener archivos de datos locales sincronizados. Combínalo con cron para actualizaciones programadas:

bash
# crontab -e: ejecutar diariamente a las 3 AM
0 3 * * * wget -N -q -P /var/data/ https://example.com/data.csv

Establecer un User-Agent personalizado

Algunos servidores bloquean peticiones de wget. Imita un navegador:

bash
wget --user-agent="Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0" \
     https://example.com/file.zip

Añadir cabeceras HTTP personalizadas

Útil para APIs que requieren un token de autorización:

bash
wget --header="Authorization: Bearer YOUR_API_TOKEN" \
     --header="Accept: application/json" \
     https://api.example.com/export/data.json

wget vs curl: ¿cuál usar?

Tanto wget como curl descargan contenido de URLs, pero tienen diferentes fortalezas:

Caso de usowgetcurl
Descarga simple de archivosExcelenteBien
Recursivo / espejado de sitiosExcelenteNo soportado
Reanudar descargas interrumpidasExcelenteExcelente
Peticiones APILimitadoExcelente
Manejo de datos de respuestaLimitadoExcelente
Descarga en segundo planoIntegrado (-b)Necesita & disown
Lote desde lista de URLsIntegrado (-i)Necesita un script
Control de método HTTPLimitadoControl total

Regla general:

  • Descargar archivos → wget
  • Llamar APIs, inspeccionar respuestas, HTTP complejo → curl
  • Scripting con manejo flexible de salida → curl

Ejemplos de scripting

Descargar múltiples versiones de un archivo

bash
#!/bin/bash

BASE_URL="https://example.com/releases"
VERSIONS=("1.0.0" "1.1.0" "1.2.0" "2.0.0")
DEST_DIR="./downloads"

mkdir -p "$DEST_DIR"

for VERSION in "${VERSIONS[@]}"; do
  FILE="myapp-${VERSION}.tar.gz"
  URL="${BASE_URL}/${VERSION}/${FILE}"

  echo "Descargando ${FILE}..."
  wget -q --show-progress -P "$DEST_DIR" "$URL"

  if [ $? -eq 0 ]; then
    echo "  OK: ${FILE}"
  else
    echo "  FALLÓ: ${FILE}"
  fi
done

echo "Hecho."

Descargar y verificar checksum

bash
#!/bin/bash

# Consulta la página oficial de releases de Ubuntu para la versión actual y el hash SHA256:
# https://releases.ubuntu.com/
URL="https://releases.ubuntu.com/24.04.1/ubuntu-24.04.1-desktop-amd64.iso"
EXPECTED_SHA256="<obtén el hash actual del sitio oficial de Ubuntu>"

echo "Descargando..."
wget -q --show-progress -O ubuntu.iso "$URL"

echo "Verificando checksum..."
# Linux: sha256sum / macOS: shasum -a 256
if command -v sha256sum &>/dev/null; then
  ACTUAL_SHA256=$(sha256sum ubuntu.iso | awk '{print $1}')
else
  ACTUAL_SHA256=$(shasum -a 256 ubuntu.iso | awk '{print $1}')
fi

if [ "$ACTUAL_SHA256" = "$EXPECTED_SHA256" ]; then
  echo "Checksum OK — el archivo es válido"
else
  echo "¡Checksum no coincide! El archivo puede estar corrupto."
  exit 1
fi

Solución de problemas

Errores de certificado SSL

bash
# Omitir verificación (bien para pruebas, evitar en producción)
wget --no-check-certificate https://example.com/file.zip

Timeouts de conexión o servidores inestables

bash
# Timeout de 30 segundos, reintentar hasta 5 veces con 10 segundos entre reintentos
wget --timeout=30 --tries=5 --waitretry=10 https://example.com/file.zip

# Reintentar indefinidamente (útil para descargas muy grandes con conexiones poco fiables)
wget --tries=0 https://example.com/file.zip

Verificar cadena de redirecciones sin descargar

Inspecciona las cabeceras y ve a dónde redirige una URL, sin descargar nada:

bash
wget --server-response --spider https://example.com/file.zip

La descarga se detiene en 0 bytes

A veces los servidores envían una respuesta pero sin datos. Intenta añadir un User-Agent o verifica si la URL requiere autenticación.

Consideraciones de seguridad

Al descargar archivos de fuentes externas, la seguridad importa.

Vulnerabilidad de wget2 (CVE-2025-69194): Se encontró una vulnerabilidad de alta severidad (CVSS 8.8) en el procesamiento de documentos Metalink de GNU Wget2. Atacantes remotos podían sobrescribir archivos locales. Si usas wget2, actualiza a 2.2.1 o posterior.

Mejores prácticas:

  • Nunca uses --no-check-certificate en producción — limítalo a pruebas con certificados autofirmados
  • Siempre verifica checksums para archivos descargados de fuentes no confiables (ver el ejemplo de script arriba)
  • La suplantación de User-Agent con --user-agent puede violar los términos de servicio de un sitio — verifica antes de hacer scraping
  • Al usar cron para descargas automatizadas, mantén logs y monitoréalos periódicamente

Conclusión

wget es una de esas herramientas que usas a diario una vez que te sientes cómodo con ella. Lo básico se aprende en cinco minutos, y las funcionalidades avanzadas están ahí cuando las necesites.

Resumen rápido de las opciones más útiles:

  • Descarga básica: wget URL
  • Renombrar salida: wget -O nombre URL
  • Guardar en directorio: wget -P /ruta/ URL
  • Segundo plano: wget -b URL
  • Reanudar: wget -c URL
  • Lote desde lista: wget -i urls.txt
  • Espejar un sitio: wget --mirror --convert-links --page-requisites URL
  • Actualización condicional: wget -N URL

Empieza con lo básico, luego recurre a los flags avanzados según surjan necesidades específicas. Y cuando te encuentres descargando archivos repetidamente en un flujo de trabajo, considera envolver wget en un script corto — se acumula bien.