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:
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.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:
# 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
Ejemplos de scripting
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.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
# 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. Atacantes remotos podían 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
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.