La commande Linux `curl` offre des fonctionnalités qui dépassent largement le simple téléchargement de fichiers. Explorons ensemble les capacités de `curl` et les situations où son utilisation est préférable à celle de `wget`.
`curl` contre `wget` : quelles distinctions ?
Il est fréquent que les utilisateurs peinent à discerner les avantages spécifiques de `wget` et `curl`. Bien qu’elles partagent des fonctions de base, comme la récupération de fichiers à distance, c’est là que s’arrêtent leurs similitudes.
`wget` est un outil performant pour le téléchargement de contenu et de fichiers. Il excelle dans la récupération de fichiers, de pages web et de répertoires. Sa capacité à parcourir les liens d’une page web et à télécharger du contenu de manière récursive sur un site entier en fait un gestionnaire de téléchargement en ligne de commande inégalable.
`curl`, quant à lui, répond à un besoin distinct. S’il peut récupérer des fichiers, il ne peut pas explorer un site web de manière récursive. `curl` permet d’interagir avec des systèmes distants en leur adressant des requêtes et en affichant leurs réponses. Ces réponses peuvent être du contenu web, des fichiers, ou des données issues d’un service web ou d’une API, en réponse à la requête formulée par `curl`.
De plus, `curl` ne se limite pas aux sites web. Il prend en charge plus de 20 protocoles, dont HTTP, HTTPS, SCP, SFTP et FTP. Sa gestion des tubes Linux facilite son intégration avec d’autres commandes et scripts.
Le créateur de `curl` a dédié une page web à l’explication des différences entre `curl` et `wget`.
Installation de `curl`
Sur les ordinateurs utilisés pour la rédaction de cet article (Fedora 31 et Manjaro 18.1.0), `curl` était déjà installé. Il a fallu l’installer sur Ubuntu 18.04 LTS. Pour ce faire, exécutez la commande suivante sur Ubuntu :
sudo apt-get install curl
Afficher la version de `curl`
L’option `–version` permet à `curl` d’afficher sa version, ainsi que la liste des protocoles qu’il prend en charge.
curl --version

Récupérer une page web
Si on utilise `curl` sur une page web, il la récupérera pour nous.
curl https://www.bbc.com

Cependant, son comportement par défaut est d’afficher le code source dans la fenêtre du terminal.

Attention : si `curl` n’est pas informé que les données doivent être enregistrées dans un fichier, il les affichera systématiquement dans le terminal. Si le fichier récupéré est binaire, le résultat peut être imprévisible, le shell pouvant tenter d’interpréter certaines octets comme des caractères de contrôle ou des séquences d’échappement.
Enregistrer les données dans un fichier
Demandons à `curl` de rediriger la sortie vers un fichier :
curl https://www.bbc.com > bbc.html

Les informations fournies sont :
% Total : Le volume total de données à récupérer.
% Recu : Le pourcentage et la quantité réelle de données reçues jusqu’à présent.
% Xferd : Le pourcentage et la quantité réelle envoyés, en cas de téléchargement en cours.
Vitesse moyenne de téléchargement : La vitesse moyenne de téléchargement.
Vitesse moyenne de chargement : La vitesse moyenne de chargement.
Durée totale : La durée totale estimée du transfert.
Temps écoulé : Le temps passé pour ce transfert.
Temps restant : Le temps estimé restant avant la fin du transfert.
Vitesse actuelle : La vitesse de transfert actuelle.
Grâce à la redirection de la sortie, un fichier « bbc.html » est créé.

En double-cliquant dessus, le navigateur par défaut s’ouvrira et affichera la page web récupérée.

Veuillez noter que l’adresse dans la barre d’adresse du navigateur correspond à un fichier local, et non à un site web distant.
Il n’est pas nécessaire de rediriger la sortie pour créer un fichier. L’option `-o` (sortie) permet à `curl` de le créer. L’exemple ci-dessous utilise l’option `-o` pour spécifier le nom du fichier à créer, `bbc.html`.
curl -o bbc.html https://www.bbc.com

Utiliser une barre de progression
Pour afficher une simple barre de progression au lieu des informations textuelles, utilisez l’option `–#` (barre de progression) :
curl -x -o bbc.html https://www.bbc.com

Reprendre un téléchargement interrompu
Il est facile de reprendre un téléchargement qui a été interrompu. Téléchargeons un fichier volumineux, par exemple la dernière version LTS d’Ubuntu 18.04. L’option `–output` spécifie le nom du fichier dans lequel enregistrer le téléchargement : `ubuntu180403.iso`.
curl --output ubuntu18043.iso http://releases.ubuntu.com/18.04.3/ubuntu-18.04.3-desktop-amd64.iso

Le téléchargement démarre et se termine.

Si le téléchargement est interrompu (Ctrl + C), il est abandonné et l’invite de commande réapparaît.
Pour le reprendre, l’option `-C` (continuer) permet à `curl` de redémarrer à partir d’un point ou d’un décalage spécifié dans le fichier cible. En utilisant un tiret `-` comme décalage, `curl` examinera la partie déjà téléchargée du fichier pour déterminer le décalage correct.
curl -C - --output ubuntu18043.iso http://releases.ubuntu.com/18.04.3/ubuntu-18.04.3-desktop-amd64.iso

Le téléchargement reprend, `curl` indiquant le décalage de redémarrage.

Récupérer les en-têtes HTTP
L’option `-I` (head) permet de récupérer uniquement les en-têtes HTTP, ce qui équivaut à envoyer une requête HTTP HEAD à un serveur web.
curl -I www.twitter.com

Cette commande récupère uniquement les en-têtes, sans télécharger la page web ou des fichiers.

Télécharger plusieurs URL
En utilisant `xargs`, il est possible de télécharger plusieurs URL simultanément. Par exemple, si vous souhaitez télécharger une série de pages web qui composent un article ou un tutoriel.
Copiez les URL suivantes dans un éditeur et enregistrez-les dans un fichier nommé `urls-to-download.txt`. `xargs` permet de traiter chaque ligne du fichier comme un paramètre.
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
Voici la commande à utiliser pour que `xargs` traite chaque URL une par une :
xargs -n 1 curl -O
La commande utilise l’option `-O` (fichier distant) pour enregistrer les fichiers téléchargés avec le même nom que celui qu’ils portent sur le serveur distant.
L’option `-n 1` indique à `xargs` de traiter chaque ligne du fichier comme un paramètre unique.
L’exécution de cette commande lancera et terminera plusieurs téléchargements, l’un après l’autre.

Une vérification dans l’explorateur de fichiers montre que plusieurs fichiers ont été téléchargés. Chaque fichier porte le nom qu’il avait sur le serveur distant.

Télécharger des fichiers depuis un serveur FTP
Utiliser `curl` avec un serveur FTP est simple, même s’il faut s’authentifier avec un nom d’utilisateur et un mot de passe. Pour cela, utilisez l’option `-u` (utilisateur) suivie du nom d’utilisateur, d’un signe deux-points `:`, et du mot de passe, sans espace.
Un serveur FTP de test gratuit est mis à disposition par Rebex. Le nom d’utilisateur est `demo`, et le mot de passe est `password`. Évitez d’utiliser des identifiants aussi faibles sur un serveur FTP de production.
curl -u demo:password ftp://test.rebex.net

`curl` détecte qu’il s’agit d’un serveur FTP et affiche la liste des fichiers disponibles.

Le serveur ne contient qu’un fichier, `readme.txt`, d’une taille de 403 octets. Récupérons-le. Utilisez la même commande en ajoutant le nom du fichier :
curl -u demo:password ftp://test.rebex.net/readme.txt

Le fichier est récupéré, et son contenu est affiché dans le terminal.

Il est généralement plus pratique d’enregistrer le fichier sur disque plutôt que de l’afficher dans le terminal. Pour cela, utilisez l’option `-O` (fichier distant) pour enregistrer le fichier avec le même nom qu’il a sur le serveur distant.
curl -O -u demo:password ftp://test.rebex.net/readme.txt

Le fichier est récupéré et enregistré sur le disque. Une commande `ls` permet de vérifier les détails : il porte le même nom que sur le serveur FTP et a la même taille de 403 octets.
ls -hl readme.txt

Envoyer des paramètres aux serveurs distants
Certains serveurs distants acceptent des paramètres dans les requêtes. Ces paramètres permettent de formater les données retournées ou de sélectionner les données précises à récupérer. Il est courant d’interagir avec des interfaces de programmation d’application (API) web à l’aide de `curl`.
Par exemple, le site ipify possède une API qui permet de vérifier l’adresse IP externe.
curl https://api.ipify.org
En ajoutant le paramètre de format avec la valeur `json`, nous pouvons demander à nouveau notre adresse IP externe, mais cette fois-ci, les données retournées seront encodées au format JSON.
curl https://api.ipify.org?format=json

Voici un autre exemple utilisant une API Google qui retourne un objet JSON décrivant un livre. Le paramètre à fournir est le numéro ISBN (International Standard Book Number) du livre, que l’on trouve généralement sous le code-barres. Dans cet exemple, le paramètre utilisé est « 0131103628 ».
curl https://www.googleapis.com/books/v1/volumes?q=isbn:0131103628

Voici les données retournées :

Parfois `curl`, parfois `wget`
Si je souhaite télécharger du contenu à partir d’un site web et explorer l’arborescence du site de manière récursive, j’utiliserai `wget`.
Si je veux interagir avec un serveur distant ou une API, et éventuellement télécharger des fichiers ou des pages web, j’utiliserai `curl`, surtout si le protocole n’est pas pris en charge par `wget`.