Cómo usar curl para descargar archivos desde la línea de comandos

El comando curl de Linux puede hacer mucho más que descargar archivos. Descubre de qué es capaz curl y cuándo debes usarlo en lugar de utilizar wget.

 curl vs wget  – ¿Cuál es la diferencia?

Las personas a menudo luchan por identificar las fortalezas relativas de los comandos wget y curl. Los comandos tienen cierta superposición funcional.

Cada uno puede recuperar archivos de ubicaciones remotas, pero ahí es donde termina la similitud.

wget es una herramienta fantástica para descargar contenido y archivos. Puede descargar archivos, páginas web y directorios.

Contiene rutinas inteligentes para recorrer enlaces en páginas web y descargar recursivamente contenido en todo un sitio web. No tiene igual como administrador de descargas de línea de comandos.

curl satisface una necesidad completamente diferente. Sí, puede recuperar archivos, pero no puede navegar recursivamente en un sitio web buscando contenido para recuperar.

Lo que realmente hace curl es permitirte interactuar con sistemas remotos haciendo solicitudes a esos sistemas y recuperando y mostrándote sus respuestas.

Esas respuestas podrían ser contenido y archivos de la página web, pero también pueden contener datos proporcionados a través de un servicio web o API como resultado de la “pregunta” formulada por la solicitud curl.

Y curl no se limita a los sitios web. Curl admite más de 20 protocolos, incluidos HTTP, HTTPS, SCP, SFTP y FTP. Y podría decirse que, debido a su manejo superior de las tuberías de Linux, curl puede integrarse más fácilmente con otros comandos y scripts.

El autor de curl tiene una página web que describe las diferencias que ve entre curlwget.

Instalar curl

Fuera de las computadoras utilizadas para investigar este artículo, Fedora 31 y Manjaro 18.1.0 ya traen instalado curl. curl tuvo que instalarse en Ubuntu 18.04 LTS. En Ubuntu, ejecuta este comando para instalarlo:

Versión de curl  

La opción –version hace que curl te informe su versión. También enumera todos los protocolos que admite.

Recuperando una página web

Si apuntamos curl a una página web, la recuperará para nosotros.

Pero su acción predeterminada es mostrarla en la ventana de la terminal como código fuente.

Cuidado: si no le especificas a curl ques quiere algo almacenado como un archivo, siempre lo mostrará en la ventana de la terminal.

Si el archivo que está recuperando es un archivo binario, el resultado puede ser impredecible. La shell puede intentar interpretar algunos de los valores de bytes en el archivo binario como caracteres de control o secuencias de escape.

Guardar datos en un archivo

Le diremos a curl que redirija la salida a un archivo:

Esta vez no vemos la información recuperada, se envía directamente al archivo por nosotros.

Debido a que no hay salida de ventana de la terminal para mostrar, curl genera un conjunto de información de progreso.

No hizo esto en el ejemplo anterior porque la información de progreso se habría dispersado por todo el código fuente de la página web, por lo que curl la suprimió automáticamente.

En este ejemplo, curl detecta que la salida se redirige a un archivo y que es seguro generar la información de progreso.

La información proporcionada es:

  • %Total: la cantidad total a recuperar.
  •  % Received: el porcentaje y los valores reales de los datos recuperados hasta el momento.
  • % Xferd: el porcentaje y el envío real, si se están cargando datos.
  • Average Speed Dload: La velocidad promedio de descarga.
  • Average Speed Upload: la velocidad de carga promedio.
  • Time total: la duración total estimada de la transferencia.
  • Tiempo spend: el tiempo transcurrido hasta ahora para esta transferencia.
  • Tiempo left: el tiempo estimado restante para que se complete la transferencia
  • Current Speed: la velocidad de transferencia actual para esta transferencia.

Debido a que redirigimos la salida curl a un archivo, ahora tenemos un archivo llamado “bbc.html”.

Al hacer doble clic en ese archivo, se abrirá tu navegador predeterminado para que muestre la página web recuperada.

Ten en cuenta que la dirección en la barra de direcciones del navegador es un archivo local en esta computadora, no un sitio web remoto.

No tenemos que redirigir la salida para crear un archivo. Podemos crear un archivo usando la opción –o (output) y diciéndole a curl que cree el archivo.

Aquí usamos la opción -o y proporcionamos el nombre del archivo que deseamos crear “bbc.html”.

Uso de una barra de progreso para monitorear descargas

Para reemplazar la información de descarga basada en texto por una barra de progreso simple, debes usar la opción -# (barra de progreso).

Reiniciar una descarga interrumpida

Es fácil reiniciar una descarga que se ha terminado o interrumpido. Comencemos la descarga de un archivo considerable.

Utilizaremos la última compilación de soporte a largo plazo de Ubuntu 18.04. Estamos usando la opción –output para especificar el nombre del archivo en el que deseamos guardarlo: “ubuntu180403.iso”.

La descarga comienza y avanza hacia su finalización.

Si interrumpimos por la fuerza la descarga con ctrl+c, volveremos al símbolo del sistema y la descarga se dejará.

Para reiniciar la descarga, usa la opción –c (continuar en). Esto hace que curl reinicie la descarga en un punto específico o desplazamiento dentro del archivo de destino.

Si usas un guión  como desplazamiento, curl observará la parte del archivo que ya ha descargado y determinará el desplazamiento correcto para usarlo por sí mismo.

La descarga se reinicia. curl informa el desplazamiento en el que se reinicia.

Recuperando encabezados HTTP

Con la opción –I (head), solo puedes recuperar los encabezados HTTP. Esto es lo mismo que enviar el comando HTTP HEAD a un servidor web.

Este comando solo recupera información; no descarga ninguna página web o archivo.

Descargar múltiples URL

Utilizando podemos xargs descargar múltiples URL’s a la vez. Quizás queremos descargar una serie de páginas web que componen un solo artículo o tutorial.

Debes copiar estas URL en un editor y guárdalo en un archivo llamado “urls-to-download.txt”. Podemos usar xargs para tratar el contenido de cada línea del archivo de texto como un parámetro al que alimentará a curl, todo a la misma vez.

Este es el comando que necesitamos usar para que xargs pase las URL a curl de una sola vez:

Ten en cuenta que este comando usa el comando de salida -O (archivo remoto), que usa una “O” mayúscula. Esta opción permite a curl que el archivo recuperado tenga el mismo nombre que el archivo tiene en el servidor remoto.

La opción -n 1 le dice xargs que trate cada línea del archivo de texto como un único parámetro.

Cuando ejecutas el comando, verás que varias descargas comienzan y finalizan, una tras otra.

La comprobación en el explorador de archivos muestra que se han descargado varios archivos. Cada uno lleva el nombre que tenía en el servidor remoto.

Descargar archivos de un servidor FTP

Usar curl con un servidor de Protocolo de transferencia de archivos (FTP) es fácil, incluso si tienes que autenticarte con un nombre de usuario y contraseña.

Para pasar un nombre de usuario y una contraseña, en curl usa la opción –u (usuario) y escribe el nombre de usuario, dos puntos “:” y la contraseña. No pongas un espacio antes o después de los 2 puntos.

Este es un servidor FTP gratuito para pruebas alojado por Rebex. El sitio FTP de prueba tiene un nombre de usuario preestablecido de “demo”, y la contraseña es “password”.

No uses este tipo de nombre de usuario y contraseña débiles en un servidor FTP de producción o “real”.

curl se da cuenta de que lo estamos apuntando a un servidor FTP y devuelve una lista de los archivos que están presentes en el servidor.

El único archivo en este servidor es un archivo “readme.txt”, de 403 bytes de longitud. Recuperémoslo. Usa el mismo comando que hace un momento, con el nombre de archivo adjunto:

El archivo se recupera y curl muestra su contenido en la ventana del terminal.

En casi todos los casos, será más conveniente tener el archivo recuperado guardado en el disco para nosotros, en lugar de mostrarlo en la ventana de la terminal. Una vez más, podemos usar el comando de salida -o (archivo remoto) para guardar el archivo en el disco, con el mismo nombre de archivo que tiene en el servidor remoto.

El archivo se recupera y se guarda en el disco. Podemos usar para ls verificar los detalles del archivo. Tiene el mismo nombre que el archivo en el servidor FTP y tiene la misma longitud, 403 bytes.

Envío de parámetros a servidores remotos

Algunos servidores remotos aceptarán parámetros en las solicitudes que se les envíen.

Los parámetros pueden usarse para formatear los datos devueltos, por ejemplo, o pueden usarse para seleccionar los datos exactos que el usuario desea recuperar.

A menudo es posible interactuar con las interfaces de programación de aplicaciones web (API) mediante curl.

Como un simple ejemplo, el sitio web de ipify tiene una API que se puede consultar para determinar tu dirección IP externa.

Al agregar el parámetro format al comando, con el valor de “json” podemos solicitar nuevamente nuestra dirección IP externa, pero esta vez los datos devueltos se codificarán en el formato JSON.

Aquí hay otro ejemplo que hace uso de una API de Google. Devuelve un objeto JSON que describe un libro.

El parámetro que debe proporcionar es el número de libro internacional estándar (ISBN) de un libro.

Puedes encontrarlos en la contraportada de la mayoría de los libros, generalmente debajo de un código de barras. El parámetro que usaremos aquí es “0131103628”.

Los datos devueltos son completos:

A veces curl, a veces wget

Si quisieras descargar contenido de un sitio web y hacer que la estructura de árbol del sitio web buscara ese contenido de forma recursiva, debes usar wget.

Si quisieras interactuar con un servidor remoto o API, y posiblemente descargar algunos archivos o páginas web, lo ideal es usar curl. Especialmente si el protocolo es uno de los muchos no admitidos por wget.