L’un des utilitaires fréquemment utilisés par les administrateurs système est wget. Il peut s’avérer très pratique lors de la résolution de problèmes liés au web.

Qu’est-ce que la commande wget ?

la commande wget est un utilitaire de ligne de commande Unix/Linux populaire qui permet de récupérer le contenu du web. Il est gratuit et permet de télécharger des fichiers depuis le web de manière non interactive. La commande wget prend en charge les protocoles HTTPS, HTTP et FTP. De plus, vous pouvez également utiliser des proxys HTTP.

Comment wget vous aide-t-il à résoudre les problèmes ?

Il y a plusieurs façons de le faire.

En tant qu’administrateur système, vous travaillerez la plupart du temps sur un terminal, et lorsque vous dépannez des problèmes liés à une application web, il se peut que vous ne souhaitiez pas vérifier la page entière, mais seulement la connectivité. Ou bien vous voulez vérifier les sites web intranet. Ou encore, vous voulez télécharger une certaine page pour en vérifier le contenu.

wget est non interactif, ce qui signifie que vous pouvez l’exécuter en arrière-plan, même lorsque vous êtes déconnecté. Dans de nombreux cas, il est essentiel que vous vous déconnectiez du système, même lorsque vous récupérez des fichiers sur le web. En arrière-plan, wget s’exécutera et terminera le travail qui lui a été assigné.

Il peut également être utilisé pour récupérer l’intégralité d’un site web sur votre machine locale. Il peut suivre les liens dans les pages XHTML et HTML pour créer une version locale. Pour ce faire, il doit télécharger la page de manière récursive. C’est très utile car vous pouvez l’utiliser pour télécharger des pages ou des sites importants pour les consulter hors ligne.

Voyons cela en action. La syntaxe de wget est la suivante.

wget [option] [URL]

Télécharger une page web

Essayons de télécharger une page. Ex : github.com

wget github.com

Si la connectivité est bonne, la page d’accueil sera téléchargée et vous obtiendrez le résultat suivant.

root@trends:~# wget github.com
URL transformée en HTTPS en raison d'une politique HSTS
--2020-02-23 10:45:52-- https://github.com/
Résolution de github.com (github.com)... 140.82.118.3
Connexion à github.com (github.com)|140.82.118.3|:443... connecté.
Requête HTTP envoyée, réponse attendue... 200 OK
Longueur : non spécifiée [text/html]
Sauvegarde dans : 'index.html'

index.html [ <=> ] 131.96K --.-KB/s en 0.04s   

2020-02-23 10:45:52 (2.89 MB/s) - 'index.html' sauvegardé [135126]

root@trends:~#

Télécharger plusieurs fichiers

Pratique lorsque vous devez télécharger plusieurs fichiers à la fois. Cela peut vous donner une idée de l’automatisation du téléchargement de fichiers à l’aide de scripts.

Essayons de télécharger les fichiers Python 3.8.1 et 3.5.1.

wget https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz

Comme vous pouvez le deviner, la syntaxe est la suivante.

wget URL1 URL2 URL3

Vous devez simplement veiller à laisser un espace entre les URL.

Limiter la vitesse de téléchargement

Il peut être utile de vérifier le temps de téléchargement d’un fichier en fonction de la bande passante.

En utilisant l’option --limit-rate, vous pouvez limiter la vitesse de téléchargement.

Voici le résultat du téléchargement du fichier Nodejs.

root@trends:~# wget https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz
--2020-02-23 10:59:58-- https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz
Résolution de nodejs.org (nodejs.org)... 104.20.23.46, 104.20.22.46, 2606:4700:10::6814:162e, ...
Connexion à nodejs.org (nodejs.org)|104.20.23.46|:443... connecté.
Requête HTTP envoyée, en attente de réponse... 200 OK
Longueur : 14591852 (14M) [application/x-xz]
Sauvegarde sur : ‘node-v12.16.1-linux-x64.tar.xz’

node-v12.16.1-linux-x64.tar.xz 100%[===========================================================================================>]  13.92M --.-KB/s en 0.05s   

2020-02-23 10:59:58 (272 MB/s) - 'node-v12.16.1-linux-x64.tar.xz' sauvegardé [14591852/14591852]

Il a fallu 0,05 seconde pour télécharger des fichiers de 13,92 Mo. Essayons maintenant de limiter la vitesse à 500K.

root@trends:~# wget --limit-rate=500k https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz
--2020-02-23 11:00:18-- https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz
Résolution de nodejs.org (nodejs.org)... 104.20.23.46, 104.20.22.46, 2606:4700:10::6814:162e, ...
Connexion à nodejs.org (nodejs.org)|104.20.23.46|:443... connecté.
Requête HTTP envoyée, en attente de réponse... 200 OK
Longueur : 14591852 (14M) [application/x-xz]
Sauvegarde sur : ‘node-v12.16.1-linux-x64.tar.xz.1’

node-v12.16.1-linux-x64.tar.xz.1 100%[===========================================================================================>]  13.92M 501KB/s en 28s   

2020-02-23 11:00:46 (500 KB/s) - 'node-v12.16.1-linux-x64.tar.xz.1' sauvegardé [14591852/14591852]

La réduction de la bande passante a pris plus de temps pour le téléchargement – 28 secondes. Imaginez que vos utilisateurs se plaignent de la lenteur du téléchargement et que vous sachiez que la bande passante de leur réseau est faible. Vous pouvez rapidement essayer --limit-rate pour simuler le problème.

Téléchargez en arrière-plan

Le téléchargement de fichiers volumineux peut prendre du temps, comme dans l’exemple ci-dessus où vous souhaitez également fixer une limite de débit. C’est normal, mais que faire si vous ne voulez pas fixer votre terminal ?

Vous pouvez utiliser l’argument -b pour lancer wget en arrière-plan.

root@trends:~# wget -b https://slack.com
Continue en arrière-plan, pid 25430.
La sortie sera écrite dans 'wget-log.1'.
root@trends:~#

Ignorer les erreurs de certificat

Ceci est pratique lorsque vous devez vérifier des applications web intranet qui n’ont pas le bon certificat. Par défaut, wget affiche une erreur lorsque le certificat n’est pas valide.

root@trends:~# wget https://expired.badssl.com/
--2020-02-23 11:24:59-- https://expired.badssl.com/
Résolution de expired.badssl.com (expired.badssl.com)... 104.154.89.105
Connexion à expired.badssl.com (expired.badssl.com)|104.154.89.105|:443... connecté.
ERROR : cannot verify expired.badssl.com's certificate, issued by 'CN=COMODO RSA Domain Validation Secure Server CA,O=COMODO CA Limited,L=Salford,ST=Greater Manchester,C=GB' :
  Le certificat émis a expiré.
Pour vous connecter à expired.badssl.com de manière non sécurisée, utilisez `--no-check-certificate'.

L’exemple ci-dessus concerne l’URL dont le certificat a expiré. Comme vous pouvez le voir, il est suggéré d’utiliser --no-check-certificate qui ignorera toute validation de certificat.

root@trends:~# wget https://untrusted-root.badssl.com/ --no-check-certificate
--2020-02-23 11:33:45-- https://untrusted-root.badssl.com/
Résolution de untrusted-root.badssl.com (untrusted-root.badssl.com)... 104.154.89.105
Connexion à untrusted-root.badssl.com (untrusted-root.badssl.com)|104.154.89.105|:443... connecté.
WARNING : cannot verify untrusted-root.badssl.com's certificate, issued by 'CN=BadSSL Untrusted Root Certificate Authority,O=BadSSL,L=San Francisco,ST=California,C=US' :
  Certificat auto-signé rencontré.
Requête HTTP envoyée, en attente de réponse... 200 OK
Longueur : 600 [text/html]
Sauvegarde dans : 'index.html.6'

index.html.6 100%[===========================================================================================>]     600 --.-KB/s en 0s  

2020-02-23 11:33:45 (122 MB/s) - 'index.html.6' sauvegardé [600/600]

root@trends:~#

Cool, n’est-ce pas ?

En-tête de réponse HTTP

Voir l’en-tête de réponse HTTP d’un site donné sur le terminal.

L’utilisation de -S permet d’afficher l’en-tête, comme vous pouvez le voir ci-dessous pour Coursera.

root@trends:~# wget https://www.coursera.org -S
--2020-02-23 11:47:01-- https://www.coursera.org/
Résolution de www.coursera.org (www.coursera.org)... 13.224.241.48, 13.224.241.124, 13.224.241.82, ...
Connexion à www.coursera.org (www.coursera.org)|13.224.241.48|:443... connecté.
Requête HTTP envoyée, réponse attendue... 
  HTTP/1.1 200 OK
  Content-Type : text/html
  Content-Length : 511551
  Connexion : keep-alive
  Cache-Control : private, no-cache, no-store, must-revalidate, max-age=0
  Date : Sun, 23 Feb 2020 11:47:01 GMT
  etag : W/"7156d-WcZHnHFl4b4aDOL4ZSrXP0iBX3o"
  Serveur : envoy
  Set-Cookie : CSRF3-Token=1583322421.s1b4QL6OXSUGHnRI ; Max-Age=864000 ; Expires=Wed, 04 Mar 2020 11:47:02 GMT ; Path=/ ; Domain=.coursera.org
  Set-Cookie : __204u=9205355775-1582458421174 ; Max-Age=31536000 ; Expires=Mon, 22 Feb 2021 11:47:02 GMT ; Path=/ ; Domain=.coursera.org
  Strict-Transport-Security : max-age=31536000 ; includeSubDomains ; preload
  X-Content-Type-Options : nosniff
  x-coursera-render-mode : html
  x-coursera-render-version : v2
  X-Coursera-Request-Id : NCnPPlYyEeqfcxIHPk5Gqw
  X-Coursera-Trace-Id-Hex: a5ef7028d77ae8f8
  x-envoy-upstream-service-time : 1090
  X-Frame-Options : SAMEORIGIN
  x-powered-by : Express
  X-XSS-Protection : 1 ; mode=block
  X-Cache : Miss from cloudfront
  Via : 1.1 884d101a3faeefd4fb32a5d2a8a076b7.cloudfront.net (CloudFront)
  X-Amz-Cf-Pop : LHR62-C3
  X-Amz-Cf-Id : vqvX6ZUQgtZAde62t7qjafIAqHXQ8BLAv8UhkPHwyTMpvH617yeIbQ==
Longueur : 511551 (500K) [text/html]

Manipuler l’agent utilisateur

Il peut arriver que vous souhaitiez vous connecter à un site en utilisant un user-agent personnalisé. Ou un user-agent spécifique à votre navigateur. Vous pouvez le faire en spécifiant --user-agent. L’exemple ci-dessous correspond à l’agent utilisateur MyCustomUserAgent.

root@trends:~# wget https://gf.dev --user-agent="MyCustomUserAgent"

En-tête de l’hôte

Lorsqu’une application est encore en cours de développement, il se peut que vous ne disposiez pas d’une URL appropriée pour la tester. Vous pouvez aussi vouloir tester une instance HTTP individuelle en utilisant l’IP, mais vous devez fournir l’en-tête de l’hôte pour que l’application fonctionne correctement. Dans ce cas, --header est utile.

Prenons un exemple de test de http://10.10.10.1 avec l’en-tête host comme application.com

wget --header="Host : application.com" http://10.10.10.1

Vous pouvez injecter n’importe quel en-tête, et pas seulement celui de l’hôte.

Se connecter à l’aide d’un proxy

Si vous travaillez dans un environnement DMZ, il se peut que vous n’ayez pas accès aux sites Internet. Mais vous pouvez profiter du proxy pour vous connecter.

wget -e use_proxy=yes http_proxy=$PROXYHOST:PORT http://externalsite.com

N’oubliez pas de mettre à jour les variables $PROXYHOST:PORT avec les valeurs réelles.

Connectez-vous en utilisant un protocole TLS spécifique

En général, je recommande d’utiliser OpenSSL pour tester le protocole TLS. Mais vous pouvez également utiliser wget.

wget --secure-protocol=TLSv1_2 https://example.com

Ce qui précède forcera wget à se connecter via TLS 1.2.

Conclusion

Connaître les commandes nécessaires peut vous aider dans votre travail. J’espère que ce qui précède vous a donné une idée de ce que vous pouvez faire avec wget.