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

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

curl vs. wget: ¿Cuál es la diferencia?

Las personas a menudo tienen dificultades para identificar las fortalezas relativas de los comandos wget y curl. Los comandos tienen cierta superposición funcional. Cada uno de ellos puede recuperar archivos de ubicaciones remotas, pero ahí es donde termina la similitud.

wget es un fantástica herramienta 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 contenido de forma recursiva en todo un sitio web. Es insuperable como administrador de descargas de línea de comandos.

rizo satisface una necesidad completamente diferente. Sí, puede recuperar archivos, pero no puede navegar de forma recursiva en un sitio web en busca de contenido para recuperar. Lo que realmente hace curl es permitirle interactuar con sistemas remotos al hacer solicitudes a esos sistemas y recuperar y mostrar sus respuestas. Esas respuestas pueden ser archivos y contenido 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 posiblemente, debido a su manejo superior de las tuberías de Linux, curl se puede integrar 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 curl y wget.

Instalación de curl

De las computadoras utilizadas para investigar este artículo, Fedora 31 y Manjaro 18.1.0 ya tenían curl instalado. curl tenía que estar instalado en Ubuntu 18.04 LTS. En Ubuntu, ejecute este comando para instalarlo:

sudo apt-get install curl

sudo apt-get install curl en una ventana de terminal

La versión rizo

La opción –version hace que curlreport sea su versión. También enumera todos los protocolos que admite.

curl --version

curl --version en una ventana de terminal

Recuperar una página web

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

curl https://www.bbc.com

curl https://www.bbc.com en una ventana de terminal

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

Salida de curl que muestra el código fuente de la página web en una ventana de terminal

Cuidado: si no le dice a curl que quiere que algo se almacene como un archivo, siempre lo volcará a la ventana del terminal. Si el archivo que está recuperando es un archivo binario, el resultado puede ser impredecible. El shell puede intentar interpretar algunos de los valores de bytes en el archivo binario como caracteres de control o secuencias de escape.

  Cómo configurar un servidor DLNA en Linux

Guardar datos en un archivo

Digamos a curl que redirija la salida a un archivo:

curl https://www.bbc.com  > bbc.html

curl https://www.bbc.com> bbc.html en una ventana de terminal ”width =” 646 ″ height = ”57 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ”  onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p>
<p> Esta vez no vemos la información recuperada, se envía directamente al archivo por nosotros.  Debido a que no hay una salida de ventana de terminal para mostrar, curl genera un conjunto de información de progreso. </p>
<p> No hizo esto en el ejemplo anterior porque la información de progreso se habría dispersado por el código fuente de la página web, entonces curl lo suprimió automáticamente. </p>
<p> En este ejemplo, curl detecta que la salida está siendo redirigida a un archivo y que es seguro generar la información de progreso. </p>
<p> <img loading =

La información proporcionada es:

% Total: la cantidad total a recuperar.
% Recibido: 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.
Descarga de velocidad media: la velocidad de descarga media.
Carga de velocidad promedio: la velocidad de carga promedio.
Tiempo total: la duración total estimada de la transferencia.
Tiempo invertido: el tiempo transcurrido hasta ahora para esta transferencia.
Tiempo restante: el tiempo estimado que queda para que se complete la transferencia
Velocidad actual: la velocidad de transferencia actual para esta transferencia.

Debido a que redirigimos la salida de curl a un archivo, ahora tenemos un archivo llamado «bbc.html».

archivo bbc.html creado por curl.

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

La página web recuperada se muestra en una ventana del navegador.

Tenga 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 (salida) 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».

curl -o bbc.html https://www.bbc.com

curl -o bbc.html https://www.bbc.com en una ventana de terminal

Uso de una barra de progreso para monitorear descargas

Para que la información de descarga basada en texto sea reemplazada por una barra de progreso simple, use la opción – # (barra de progreso).

curl -x -o bbc.html https://www.bbc.com

curl -x -o bbc.html https://www.bbc.com en una ventana de terminal

Reinicio de una descarga interrumpida

Es fácil reiniciar una descarga que se ha terminado o interrumpido. Iniciemos la descarga de un archivo considerable. Usaremos 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».

curl --output ubuntu18043.iso http://releases.ubuntu.com/18.04.3/ubuntu-18.04.3-desktop-amd64.iso

curl --output ubuntu18043.iso http://releases.ubuntu.com/18.04.3/ubuntu-18.04.3-desktop-amd64.iso en una ventana de terminal

La descarga comienza y avanza hacia su finalización.

  Las 6 mejores herramientas de selección de color para Linux

Progreso de una gran descarga en una terminal widnow

Si interrumpimos a la fuerza la descarga con Ctrl + C, regresamos al símbolo del sistema y la descarga se abandona.

Para reiniciar la descarga, use la opción -C (continuar en). Esto hace que curl reinicie la descarga en un punto o desplazamiento específico dentro del archivo de destino. Si usa un guión, como el desplazamiento, curl observará la parte del archivo ya descargada y determinará el desplazamiento correcto que se utilizará por sí mismo.

curl -C - --output ubuntu18043.iso http://releases.ubuntu.com/18.04.3/ubuntu-18.04.3-desktop-amd64.iso

curl -C - --output ubuntu18043.iso http://releases.ubuntu.com/18.04.3/ubuntu-18.04.3-desktop-amd64.iso en una ventana de terminal

Se reinicia la descarga. curl informa el desplazamiento en el que se está reiniciando.

curl -C - --output ubuntu18043.iso http://releases.ubuntu.com/18.04.3/ubuntu-18.04.3-desktop-amd64.iso en una ventana de terminal

Recuperando encabezados HTTP

Con la opción -I (encabezado), puede recuperar solo los encabezados HTTP. Esto es lo mismo que enviar el Comando HTTP HEAD a un servidor web.

curl -I www.twitter.com

curl -I www.twitter.com en una ventana de terminal

Este comando solo recupera información; no descarga páginas web ni archivos.

Salida de curl -I www.twitter.com en una ventana de terminal

Descarga de varias URL

Usando xargs podemos descargar múltiples URLs En seguida. Quizás queramos descargar una serie de páginas web que componen un solo artículo o tutorial.

Copie estas URL en un editor y guárdelas 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 que alimentará a curl, a su vez.

https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#0
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#1
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#2
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#3
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#4
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-ubuntu#5

Este es el comando que debemos usar para que los xargs pasen estas URL para curvar una a la vez:

xargs -n 1 curl -O 

Note that this command uses the -O (remote file) output command, which uses an uppercase “O.” This option causes curl to save the retrieved  file with the same name that the file has on the remote server.

The -n 1 option tells xargs to treat each line of the text file as a single parameter.

When you run the command, you’ll see multiple downloads start and finish, one after the other.

Salida de xargs y curl descargando varios archivos

Checking in the file browser shows the multiple files have been downloaded. Each one bears the name it had on the remote server.

archivo descargado sin el navegador de archivos nautilus

Descarga de archivos desde un servidor FTP

Usando rizo con un Protocolo de transferencia de archivos (FTP) es fácil, incluso si tiene que autenticarse con un nombre de usuario y contraseña. Para pasar un nombre de usuario y contraseña con curl, use la opción -u (usuario) y escriba el nombre de usuario, dos puntos “:” y la contraseña. No ponga un espacio antes o después del colon.

Este es un servidor FTP gratuito para pruebas alojado por Rebex. El sitio FTP de prueba tiene un nombre de usuario preestablecido de "demostración" y la contraseña es "contraseña". No utilice este tipo de nombre de usuario y contraseña débiles en un servidor FTP de producción o "real".

curl -u demo: contraseña ftp://test.rebex.net

curl -u demo: contraseña ftp://test.rebex.net en una ventana de terminal

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.

Lista de archivos en un servidor FTP remoto en una ventana de terminal

El único archivo en este servidor es un archivo "readme.txt", de 403 bytes de longitud. Vamos a recuperarlo. Utilice el mismo comando que hace un momento, con el nombre de archivo adjunto:

curl -u demo:password ftp://test.rebex.net/readme.txt

curl -u demo: contraseña ftp://test.rebex.net/readme.txt en una ventana de terminal

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

El contenido de un archivo recuperado de un servidor FTP que se muestra en una ventana de terminal

En casi todos los casos, será más conveniente guardar el archivo recuperado en el disco, 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.

curl -O -u demo:password ftp://test.rebex.net/readme.txt

curl -O -u demo: contraseña ftp://test.rebex.net/readme.txt en una ventana de terminal

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

ls -hl readme.txt

ls -hl readme.txt en una ventana de terminal

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 la web interfaces de programación de aplicaciones (API) mediante curl.

Como ejemplo simple, el ipificar El sitio web tiene una API que se puede consultar para determinar su dirección IP externa.

curl https://api.ipify.org

Añadiendo el parámetro de formato al comando, con el valor de "json" podemos volver a solicitar nuestra dirección IP externa, pero esta vez los datos devueltos serán codificados en el Formato JSON.

curl https://api.ipify.org?format=json

curl https://api.ipify.org en una ventana de terminal

Aquí hay otro ejemplo que utiliza una API de Google. Devuelve un objeto JSON que describe un libro. El parámetro que debe proporcionar es el International Standard Book Number (ISBN) número de un libro. Puede 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".

curl https://www.googleapis.com/books/v1/volumes?q=isbn:0131103628

curl https://www.googleapis.com/books/v1/volumes?q=isbn:0131103628 en una ventana de terminal

Los datos devueltos son completos:

Los datos de la API de libros de Google se muestran en una ventana de terminal

A veces rizo, a veces wget

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

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