wget es una herramienta CLI para descargar archivos por HTTP, HTTPS y FTP. Ejecuta wget URL para descargar un archivo, usa -c para reanudar transferencias interrumpidas, -i para descargas por lotes desde una lista de URLs, y --mirror para clonar sitios web completos.
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:
wget --version
Si no lo tienes:
# 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
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
# 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:
wget -b https://example.com/largefile.iso
La salida va a wget-log. Monitorea el progreso con:
tail -f wget-log
Referencia de opciones comunes
| Opción | Qué hace |
|---|---|
-O ARCHIVO | Guardar como ARCHIVO |
-P DIRECTORIO | Guardar en el directorio DIRECTORIO |
-b | Modo segundo plano |
-c | Continuar/reanudar descarga interrumpida |
-q | Modo silencioso (sin salida) |
--limit-rate=VELOCIDAD | Limitar velocidad (ej. --limit-rate=1m) |
-r | Descarga recursiva |
-l PROFUNDIDAD | Establecer profundidad de recursión |
--no-check-certificate | Omitir verificación SSL |
-i ARCHIVO | Descargar URLs listadas en ARCHIVO |
--user-agent=STRING | Establecer User-Agent personalizado |
--header=STRING | Añadir cabecera HTTP |
-N | Solo descargar si es más nuevo que la copia local |
--tries=N | Número de intentos de reintento |
--timeout=SEGUNDOS | Establecer 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:
cat > urls.txt << EOF
https://releases.ubuntu.com/24.04.4/ubuntu-24.04.4-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:
# 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:
# 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:
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:
wget --user=myusername https://example.com/protected/file.zip
# pregunta: Password for 'myusername'@example.com:
Para FTP:
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:
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.htmla 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:
wget -N https://example.com/data.csv
Esto es genial para mantener archivos de datos locales sincronizados. Combínalo con cron para actualizaciones programadas:
# 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:
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:
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 uso | wget | curl |
|---|---|---|
| Descarga simple de archivos | Excelente | Bien |
| Recursivo / espejado de sitios | Excelente | No soportado |
| Reanudar descargas interrumpidas | Excelente | Excelente |
| Peticiones API | Limitado | Excelente |
| Manejo de datos de respuesta | Limitado | Excelente |
| Descarga en segundo plano | Integrado (-b) | Necesita & disown |
| Lote desde lista de URLs | Integrado (-i) | Necesita un script |
| Control de método HTTP | Limitado | Control total |
Regla general:
- Descargar archivos → wget
- Llamar APIs, inspeccionar respuestas, HTTP complejo → curl
- Scripting con manejo flexible de salida → curl
Técnicas avanzadas
Verificar enlaces rotos con --spider
Verifica URLs sin descargar nada. Útil para comprobar enlaces rotos en sitios web.
# Verificar una sola URL
wget --spider https://example.com/page.html
# Verificación por lotes desde una lista de URLs
wget --spider -i urls.txt 2>&1 | grep -E "broken|200|404"
# Verificar recursivamente un sitio entero (sin descargas)
wget --spider --recursive --no-directories --level=2 \
https://example.com/ 2>&1 | grep -B1 "broken"
--spider envía solo peticiones HEAD, usando casi nada de ancho de banda. Útil en pipelines CI/CD para detectar automáticamente enlaces rotos en sitios de documentación.
Persistir configuración con wgetrc
Deja de escribir las mismas opciones cada vez guardando valores por defecto en ~/.wgetrc.
# ~/.wgetrc
# Preservar timestamps
timestamping = on
# Número de reintentos
tries = 3
# Timeout de conexión (segundos)
timeout = 30
# Límite de ancho de banda por defecto
limit_rate = 2m
# Archivo de log
logfile = /tmp/wget.log
# Respetar robots.txt
robots = on
# La configuración de wgetrc se aplica automáticamente
wget https://example.com/file.zip
# Sobrescribir configuración temporalmente
wget --no-config https://example.com/file.zip
wget --limit-rate=0 https://example.com/file.zip
Usa --no-config para ignorar wgetrc completamente. Para configuraciones de equipo, usa /etc/wgetrc.
Registrar URLs rechazadas con --rejected-log
Al descargar muchos archivos, registra qué falló para revisión posterior.
# Registrar URLs rechazadas
wget --recursive --level=1 \
--rejected-log=rejected.log \
https://example.com/downloads/
# Reintentar solo las URLs que fallaron
cat rejected.log | awk '{print $1}' | wget -i -
Descargar archivos grandes en segundo plano
# -b ejecuta en segundo plano (el log va a wget-log)
wget -b https://example.com/large-file.iso
# Monitorear progreso
tail -f wget-log
# Especificar un archivo de log personalizado
wget -b -o download.log https://example.com/large-file.iso
Si necesitas que las descargas sobrevivan desconexiones SSH, combina con tmux o usa nohup.
nohup wget https://example.com/large-file.iso &
Ejemplos de scripting
wget se combina naturalmente con scripts de shell. Aquí van algunos patrones prácticos.
Descargar múltiples versiones de un archivo
#!/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
#!/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.4/ubuntu-24.04.4-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
# 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
# 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:
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. Al usar --force-metalink, un fallo de path traversal permite a atacantes remotos sobrescribir archivos locales. Si usas wget2, actualiza a 2.2.1 o posterior.
Mejores prácticas:
- Nunca uses
--no-check-certificateen 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-agentpuede 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
Artículos relacionados
- Guía completa de curl — usa curl para comunicación API y depuración HTTP, wget para descargas de archivos
- Guía práctica de SSH y rsync — rsync para sincronizar archivos con servidores remotos
- Guía de cron y systemd timer — automatiza descargas periódicas con wget -N
- Guía de shell scripting — integra wget en scripts de automatización
- Guía de tar y compresión — extrae archivos descargados
- Kit de herramientas CLI — el panorama general de herramientas CLI y cuándo usar cada una
Preguntas frecuentes
¿Cuándo usar wget en lugar de curl?
Usa wget para descargas simples de archivos, procesamiento por lotes con listas de URLs (-i), espejado recursivo de sitios y descargas en segundo plano. Usa curl cuando necesites control fino sobre métodos HTTP, manejo de respuestas o interacciones con APIs.
¿Cómo reanudo una descarga interrumpida con wget?
Ejecuta wget -c URL con la misma URL. wget verifica el tamaño del archivo local y solicita solo los bytes restantes al servidor. Esto requiere que el servidor soporte peticiones HTTP Range.
¿Cómo espejo un sitio web completo con wget?
Usa wget --mirror --convert-links --adjust-extension --page-requisites --no-parent URL. El flag --mirror habilita la descarga recursiva con profundidad infinita y verificación de timestamps, mientras que --convert-links reescribe las URLs para navegación offline.
¿Cuál es la diferencia entre wget2 y wget 1.x?
wget2 es la reescritura de nueva generación de GNU Wget. Añade soporte HTTP/2, descargas paralelas, multi-threading y mejor rendimiento. Sin embargo, no es totalmente compatible con scripts de wget 1.x, así que prueba antes de migrar.
¿Cómo uso wget a través de un proxy?
Establece las variables de entorno http_proxy y https_proxy, o añade las directivas http_proxy / https_proxy en ~/.wgetrc. Usa --no-proxy para ignorar temporalmente la configuración del proxy.
¿Cómo limito la velocidad de descarga de wget?
Usa --limit-rate=1m (1 MB/s) o --limit-rate=500k (500 KB/s). Para establecer un límite por defecto, añade limit_rate = 2m en tu archivo ~/.wgetrc.
¿Cuál es la diferencia entre wget -O y -P?
-O nombre especifica el nombre exacto del archivo de salida. -P directorio especifica el directorio de destino, y el nombre del archivo se deriva automáticamente de la URL.
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. Para la referencia completa de opciones, consulta el manual oficial de GNU Wget.
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 de shell corto — se acumula bien.