Comment utiliser curl pour télécharger des fichiers à partir de la ligne de commande Linux

La commande Linux curl peut faire bien plus que télécharger des fichiers. Découvrez ce dont curl est capable et quand vous devriez l’utiliser à la place de wget.

curl vs wget: quelle est la différence?

Les gens ont souvent du mal à identifier les forces relatives des commandes wget et curl. Les commandes ont un certain chevauchement fonctionnel. Ils peuvent chacun récupérer des fichiers à partir d’emplacements distants, mais c’est là que s’arrête la similitude.

wget est un outil fantastique pour télécharger du contenu et des fichiers. Il peut télécharger des fichiers, des pages Web et des répertoires. Il contient des routines intelligentes pour parcourir les liens dans les pages Web et télécharger du contenu de manière récursive sur l’ensemble d’un site Web. Il est inégalé en tant que gestionnaire de téléchargement en ligne de commande.

curl satisfait un besoin tout à fait différent. Oui, il peut récupérer des fichiers, mais il ne peut pas naviguer de manière récursive sur un site Web à la recherche de contenu à récupérer. Curl vous permet en réalité d’interagir avec des systèmes distants en adressant des requêtes à ces systèmes, en récupérant et en affichant leurs réponses. Ces réponses peuvent bien être du contenu et des fichiers de page Web, mais elles peuvent également contenir des données fournies via un service Web ou une API à la suite de la «question» posée par la requête curl.

Et curl ne se limite pas aux sites Web. curl prend en charge plus de 20 protocoles, notamment HTTP, HTTPS, SCP, SFTP et FTP. Et sans doute, en raison de sa gestion supérieure des tubes Linux, curl peut être plus facilement intégré à d’autres commandes et scripts.

L’auteur de curl a une page Web qui décrit les différences qu’il voit entre curl et wget.

Installation de curl

Sur les ordinateurs utilisés pour rechercher cet article, Fedora 31 et Manjaro 18.1.0 avaient curl déjà installé. curl devait être installé sur Ubuntu 18.04 LTS. Sur Ubuntu, exécutez cette commande pour l’installer:

sudo apt-get install curl

sudo apt-get install curl dans une fenêtre de terminal

La version curl

L’option –version fait de curlreport sa version. Il répertorie également tous les protocoles qu’il prend en charge.

curl --version

curl --version dans une fenêtre de terminal

Récupération d’une page Web

Si nous pointons curl sur une page Web, il la récupérera pour nous.

curl https://www.bbc.com

curl https://www.bbc.com dans une fenêtre de terminal

Mais son action par défaut est de le vider dans la fenêtre du terminal en tant que code source.

  Texte, cadres et collages; 3 choses qu'Instagram ne fait pas et applications pour les faire

Sortie de curl affichant le code source de la page Web dans une fenêtre de terminal

Attention: si vous ne dites pas à curl que vous voulez que quelque chose soit stocké sous forme de fichier, il le videra toujours dans la fenêtre du terminal. Si le fichier qu’il récupère est un fichier binaire, le résultat peut être imprévisible. Le shell peut essayer d’interpréter certaines des valeurs d’octets du fichier binaire comme des caractères de contrôle ou des séquences d’échappement.

Enregistrement des données dans un fichier

Disons à curl de rediriger la sortie dans un fichier:

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

curl https://www.bbc.com> bbc.html dans une fenêtre de terminal ”width =” 646 ″ height = ”57 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ” onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p><p> Cette fois, nous ne voyons pas les informations récupérées, elles sont envoyées directement au fichier pour nous. Comme il n’y a pas de sortie de fenêtre de terminal à afficher, curl génère un ensemble d’informations de progression. </p><p> Il ne l’a pas fait dans l’exemple précédent car les informations de progression auraient été dispersées dans le code source de la page Web donc curl l’a automatiquement supprimé. </p><p> Dans cet exemple, curl détecte que la sortie est redirigée vers un fichier et qu’il est sûr de générer les informations de progression. </p><p> <img loading =

Les informations fournies sont:

% Total: Le montant total à récupérer.
% Reçu: Le pourcentage et les valeurs réelles des données récupérées jusqu’à présent.
% Xferd: Le pourcentage et le réel envoyés, si les données sont en cours de téléchargement.
Vitesse moyenne de téléchargement: vitesse de téléchargement moyenne.
Vitesse moyenne de téléchargement: vitesse moyenne de téléchargement.
Durée totale: durée totale estimée du transfert.
Temps passé: le temps écoulé jusqu’à présent pour ce transfert.
Temps restant: le temps estimé restant avant la fin du transfert
Vitesse actuelle: La vitesse de transfert actuelle pour ce transfert.

Parce que nous avons redirigé la sortie de curl vers un fichier, nous avons maintenant un fichier appelé «bbc.html».

bbc.html fichier créé par curl.

Double-cliquez sur ce fichier pour ouvrir votre navigateur par défaut pour afficher la page Web récupérée.

Page Web récupérée affichée dans une fenêtre de navigateur.

Notez que l’adresse dans la barre d’adresse du navigateur est un fichier local sur cet ordinateur et non un site Web distant.

Nous n’avons pas à rediriger la sortie pour créer un fichier. Nous pouvons créer un fichier en utilisant l’option -o (sortie) et en demandant à curl de créer le fichier. Ici, nous utilisons l’option -o et fournissons le nom du fichier que nous souhaitons créer «bbc.html».

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

curl -o bbc.html https://www.bbc.com dans une fenêtre de terminal

Utilisation d’une barre de progression pour surveiller les téléchargements

Pour faire remplacer les informations de téléchargement textuelles par une simple barre de progression, utilisez l’option – # (barre de progression).

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

curl -x -o bbc.html https://www.bbc.com dans une fenêtre de terminal

Redémarrage d’un téléchargement interrompu

Il est facile de redémarrer un téléchargement qui a été interrompu ou interrompu. Commençons par télécharger un fichier volumineux. Nous utiliserons la dernière version du support à long terme d’Ubuntu 18.04. Nous utilisons l’option –output pour spécifier le nom du fichier dans lequel nous souhaitons l’enregistrer: «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 dans une fenêtre de terminal

Le téléchargement démarre et s’achève.

  Comment démarrer à partir d'une clé USB

Progression d'un gros téléchargement dans une veuve de terminal

Si nous interrompons de force le téléchargement avec Ctrl + C, nous revenons à l’invite de commande et le téléchargement est abandonné.

Pour redémarrer le téléchargement, utilisez l’option -C (continuer à). Cela entraîne curl à redémarrer le téléchargement à un point ou un décalage spécifié dans le fichier cible. Si vous utilisez un trait d’union – comme décalage, curl examinera la partie déjà téléchargée du fichier et déterminera le décalage correct à utiliser pour lui-même.

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 dans une fenêtre de terminal

Le téléchargement est redémarré. curl signale le décalage auquel il redémarre.

curl -C - --output ubuntu18043.iso http://releases.ubuntu.com/18.04.3/ubuntu-18.04.3-desktop-amd64.iso dans une fenêtre de terminal

Récupération des en-têtes HTTP

Avec l’option -I (head), vous ne pouvez récupérer que les en-têtes HTTP. Cela revient à envoyer le Commande HTTP HEAD à un serveur Web.

curl -I www.twitter.com

curl -I www.twitter.com dans une fenêtre de terminal

Cette commande récupère uniquement les informations; il ne télécharge aucune page Web ni aucun fichier.

Sortie de curl -I www.twitter.com dans une fenêtre de terminal

Téléchargement de plusieurs URL

En utilisant xargs, nous pouvons télécharger plusieurs URL immediatement. Peut-être voulons-nous télécharger une série de pages Web qui composent un seul article ou didacticiel.

Copiez ces URL dans un éditeur et enregistrez-le dans un fichier appelé « urls-to-download.txt ». Nous pouvons utiliser xargs pour traiter le contenu de chaque ligne du fichier texte en tant que paramètre qu’il alimentera à son tour.

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

C’est la commande que nous devons utiliser pour que xargs transmette ces URL à une boucle à la fois:

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.

Sortie de xargs et curl téléchargeant plusieurs fichiers

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

fichier téléchargé dans le navigateur de fichiers Nautilus

Téléchargement de fichiers depuis un serveur FTP

Utiliser curl avec un Protocole de transfer de fichier Le serveur (FTP) est facile, même si vous devez vous authentifier avec un nom d'utilisateur et un mot de passe. Pour passer un nom d'utilisateur et un mot de passe avec curl, utilisez l'option -u (utilisateur) et saisissez le nom d'utilisateur, un signe deux-points «:» et le mot de passe. Ne mettez pas d'espace avant ou après le côlon.

Il s'agit d'un serveur FTP gratuit pour les tests hébergé par Rebex. Le site FTP de test a un nom d'utilisateur prédéfini «demo» et le mot de passe est «password». N'utilisez pas ce type de nom d'utilisateur et de mot de passe faibles sur un serveur FTP de production ou «réel».

curl -u demo: mot de passe ftp://test.rebex.net

curl -u demo: mot de passe ftp://test.rebex.net dans une fenêtre de terminal

curl comprend que nous le pointons vers un serveur FTP et renvoie une liste des fichiers présents sur le serveur.

Liste des fichiers sur un serveur FTP remtoe dans une fenêtre de terminal

Le seul fichier sur ce serveur est un fichier «readme.txt», d'une longueur de 403 octets. Récupérons-le. Utilisez la même commande qu'il y a un instant, avec le nom de fichier ajouté:

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

curl -u demo: mot de passe ftp://test.rebex.net/readme.txt dans une fenêtre de terminal

Le fichier est récupéré et curl affiche son contenu dans la fenêtre du terminal.

Le contenu d'un fichier récupéré sur un serveur FTP affiché dans une fenêtre de terminal

Dans presque tous les cas, il sera plus pratique de sauvegarder le fichier récupéré sur le disque pour nous, plutôt que de l'afficher dans la fenêtre du terminal. Une fois de plus, nous pouvons utiliser la commande de sortie -O (fichier distant) pour enregistrer le fichier sur le disque, avec le même nom de fichier que celui qu'il a sur le serveur distant.

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

curl -O -u demo: mot de passe ftp://test.rebex.net/readme.txt dans une fenêtre de terminal

Le fichier est récupéré et enregistré sur le disque. Nous pouvons utiliser ls pour vérifier les détails du fichier. Il porte le même nom que le fichier sur le serveur FTP et il a la même longueur, 403 octets.

ls -hl readme.txt

ls -hl readme.txt dans une fenêtre de terminal

Envoi de paramètres aux serveurs distants

Certains serveurs distants accepteront des paramètres dans les demandes qui leur sont envoyées. Les paramètres peuvent être utilisés pour formater les données renvoyées, par exemple, ou ils peuvent être utilisés pour sélectionner les données exactes que l'utilisateur souhaite récupérer. Il est souvent possible d'interagir avec le Web interfaces de programmation d'application (API) utilisant curl.

À titre d'exemple simple, le ipify site Web a une API peut être interrogée pour vérifier votre adresse IP externe.

curl https://api.ipify.org

En ajoutant le paramètre de format à la commande, avec la valeur «json», nous pouvons à nouveau demander notre adresse IP externe, mais cette fois les données renvoyées seront encodées dans le Format JSON.

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

curl https://api.ipify.org dans une fenêtre de terminal

Voici un autre exemple qui utilise une API Google. Il renvoie un objet JSON décrivant un livre. Le paramètre que vous devez fournir est le Numéro international normalisé du livre (ISBN) numéro d'un livre. Vous pouvez les trouver sur la quatrième de couverture de la plupart des livres, généralement sous un code-barres. Le paramètre que nous utiliserons ici est «0131103628».

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

curl https://www.googleapis.com/books/v1/volumes?q=isbn:0131103628 dans une fenêtre de terminal

Les données renvoyées sont complètes:

Données de l'API Google Book affichées dans une fenêtre de terminal

Parfois curl, parfois wget

Si je voulais télécharger du contenu à partir d'un site Web et que l'arborescence du site Web recherchait récursivement ce contenu, j'utiliserais wget.

Si je voulais interagir avec un serveur distant ou une API, et éventuellement télécharger des fichiers ou des pages Web, j'utiliserais curl. Surtout si le protocole était l'un des nombreux non pris en charge par wget.