Descomprime archivos directamente con cURL y línea de comandos
Descargar y descomprimir archivos comprimidos es una tarea habitual. Normalmente, primero
descargarías el archivo comprimido y después lo descomprimirías. Pero ¿sabías que puedes agilizar
este proceso combinando cURL con herramientas de línea de comandos?
Veamos cómo.
Comandos básicos de cURL para descargar
cURL es una potente herramienta de línea de comandos para transferir
datos con URL. Para descargar simplemente un archivo, normalmente usas:
curl -fsSLo archive.zip https://example.com/archive.zip
Las opciones utilizadas tienen propósitos específicos:
-f: Falla silenciosamente ante errores del servidor (códigos de respuesta HTTP >= 400).cURLno devolverá HTML ni otro contenido de error.-s: Modo silencioso. No muestra el medidor de progreso ni los mensajes de error. Hace quecURLtrabaje en silencio.-S: Muestra el error. Cuando se usa con-s, seguirá mostrando un mensaje de error sicURLfalla.-L: Sigue las redirecciones. Si el servidor responde con una redirección (3xx),cURLla seguirá.-o <filename>: Escribe la salida en<filename>en lugar de stdout.
Ahora veamos cómo combinar la descarga y la descompresión para distintos formatos de archivo comprimido.
Manejo de distintos formatos de archivo comprimido
El enfoque varía según el tipo de archivo comprimido y las capacidades de la herramienta de descompresión.
Archivos Zip (.zip)
El comando estándar unzip no admite de forma fiable la lectura desde la
entrada estándar (stdin), lo que impide canalizar directamente desde
cURL. El método más robusto es descargar primero a un archivo temporal,
luego extraer y, por último, eliminar ese archivo temporal.
# Download, extract to current directory, then clean up
curl -fsSL https://example.com/archive.zip -o temp.zip || { echo "Download failed"; exit 1; }
unzip temp.zip || { echo "Extraction failed"; rm temp.zip; exit 1; }
rm temp.zip
Para extraer el contenido a un directorio específico, usa la opción
-d con unzip:
# Download, extract to a specific directory, then clean up
curl -fsSL https://example.com/archive.zip -o temp.zip || { echo "Download failed"; exit 1; }
unzip temp.zip -d /path/to/extract || { echo "Extraction failed"; rm temp.zip; exit 1; }
rm temp.zip
Archivos tar gzip (.tar.gz o .tgz)
Para los archivos .tar.gz, puedes canalizar directamente la salida de
cURL al comando tar.
tar puede leer los datos del archivo comprimido desde stdin.
# Download and extract to current directory
curl -fsSL https://example.com/archive.tar.gz | tar xzf - || { echo "Download or extraction failed"; exit 1; }
Aquí, las opciones de tar son:
x: Extrae archivos de un archivo contenedor.z: Filtra el archivo contenedor a través degzip(para la compresión.gz).f -: Lee el archivo contenedor desde el archivo especificado.-indica la entrada estándar.
Para extraer a un directorio específico, usa la opción -C (fíjate en la
C mayúscula):
# Download and extract to a specific directory
curl -fsSL https://example.com/archive.tar.gz | tar xzf - -C /path/to/extract || { echo "Download or extraction failed"; exit 1; }
Archivos Gzip (.gz)
Para archivos individuales comprimidos con gzip (que terminan en
.gz), puedes canalizar la salida de cURL a
gunzip. Como gunzip envía el contenido
descomprimido a stdout de forma predeterminada, necesitas redirigirlo a un archivo.
# Download and decompress to 'outputfile'
curl -fsSL https://example.com/file.gz | gunzip > outputfile || { echo "Download or decompression failed"; exit 1; }
Si el propio archivo .gz contiene un archivo
tar (como un .tar.gz pero nombrado solo
.gz), canalizarías hacia tar en su lugar, de
forma similar al ejemplo de .tar.gz:
# If file.gz actually contains a Tar archive
curl -fsSL https://example.com/file.gz | tar xzf - || { echo "Download or extraction failed"; exit 1; }
Consideraciones de seguridad
Cuando descargues y extraigas archivos comprimidos directamente desde URL, especialmente en scripts automatizados, ten en cuenta estas prácticas de seguridad:
- Verifica las fuentes: Descarga archivos comprimidos únicamente de fuentes de confianza. Los archivos comprimidos maliciosos pueden contener malware o explotar vulnerabilidades en las herramientas de descompresión.
- Directorios dedicados: Extrae los archivos comprimidos en directorios dedicados y vacíos siempre que sea posible. Así se evita sobrescribir accidentalmente archivos existentes.
- Recorrido de rutas: Ten cuidado con los archivos comprimidos que contienen archivos con rutas
absolutas o rutas que suben de nivel (
../). Algunas herramientas de extracción tienen opciones para mitigarlo (por ejemplo,tarofrece--strip-components, que a veces puede ayudar, aunque hace falta revisarlo con cuidado). Los archivos comprimidos maliciosos podrían intentar sobrescribir archivos del sistema. - Agotamiento de recursos: Los archivos comprimidos muy grandes o las «bombas zip» (archivos comprimidos pequeños que se descomprimen hasta tamaños enormes) pueden agotar el espacio en disco o la memoria. Establece límites o supervisa el uso de recursos si trabajas con archivos comprimidos que no son de confianza.
- Permisos: Evita ejecutar los comandos de descarga y extracción como root o con privilegios innecesarios. Los archivos extraídos podrían heredar permisos que resulten inseguros.
Errores comunes y consejos para solucionar problemas
- URL incorrecta o problemas de red: Revisa bien la URL. Usa
curl -v(modo detallado) para diagnosticar problemas de conexión si la descarga falla. - Errores de permisos: Asegúrate de que tu script o tu usuario tenga permisos de escritura en el
directorio de extracción de destino. Revisa la salida del comando
unzipotaren busca de errores de permiso denegado. - Formato de archivo comprimido no compatible: Asegúrate de usar la herramienta correcta
(
unzip,tar,gunzip) para el tipo de archivo comprimido. El comandofile archive.extpuede ayudar a identificar el tipo. - Descargas dañadas: Los problemas de red pueden provocar descargas incompletas o dañadas. Añade
la opción
--retry 3acURLpara reintentar automáticamente unas cuantas veces las descargas fallidas, lo que puede ayudar en conexiones inestables. - Espacio en disco: Asegúrate de que haya suficiente espacio en disco disponible antes de iniciar la descarga y la extracción, especialmente con archivos comprimidos grandes.
- Herramienta no encontrada: Asegúrate de que
curl,unzip,tarygunzipestén instalados en tu sistema.
Agilizar tu flujo de trabajo
Combinar cURL con herramientas de descompresión de línea de comandos
resulta especialmente útil en escenarios como:
- Configurar entornos de desarrollo.
- Automatizar instalaciones de software en pipelines de CI/CD.
- Obtener y procesar conjuntos de datos.
- Actualizar dependencias de aplicaciones obtenidas como archivos comprimidos.
Este enfoque evita guardar el archivo comprimido intermedio, lo que ahorra espacio en disco y puede
acelerar los flujos de trabajo, especialmente con archivos tar.gz y
.gz, donde es posible la transmisión directa.
Si necesitas una solución programática más robusta para manejar varios formatos de archivo comprimido dentro de tu aplicación, considera usar un servicio dedicado. Por ejemplo, el servicio de compresión de archivos de Transloadit incluye un 🤖 Robot /file/decompress que admite múltiples formatos (ZIP, 7-Zip, RAR, GNU tar, ISO9660, CAB, LHA/LZH, XAR) e incorpora medidas de seguridad como la prevención de ataques basados en enlaces simbólicos.
