J'ai une liste d'URL que je dois vérifier, pour voir si elles fonctionnent toujours ou non. J'aimerais écrire un script bash qui le fasse pour moi.
Je n'ai besoin que du code d'état HTTP renvoyé, c'est-à-dire 200, 404, 500 et ainsi de suite. Rien de plus.
EDIT Notez qu'il y a un problème si la page dit "404 non trouvé" mais renvoie un message 200 OK. C'est un serveur Web mal configuré, mais vous devrez peut-être considérer ce cas.
Pour en savoir plus, consultez Vérifier si une URL mène à une page contenant le texte "404"
Réponses:
Curl a une option spécifique
--write-out
, pour cela:$ curl -o /dev/null --silent --head --write-out '%{http_code}\n' <url> 200
-o /dev/null
jette la sortie habituelle--silent
jette la jauge de progression--head
fait une requête HTTP HEAD au lieu de GET--write-out '%{http_code}\n'
imprime le code d'état requisPour résumer cela dans un script Bash complet:
#!/bin/bash while read LINE; do curl -o /dev/null --silent --head --write-out "%{http_code} $LINE\n" "$LINE" done < url-list.txt
(Les lecteurs aux yeux d'aigle remarqueront que cela utilise un processus curl par URL, ce qui impose des pénalités de fork et de connexion TCP. Ce serait plus rapide si plusieurs URL étaient combinées dans une seule boucle, mais il n'y a pas d'espace pour écrire la répétition monstre des options dont curl a besoin pour ce faire.)
la source
http://example.com/\r
en passant par la bouclewget --spider -S "http://url/to/be/checked" 2>&1 | grep "HTTP/" | awk '{print $2}'
imprime uniquement le code d'état pour vous
la source
Prolongeant la réponse déjà fournie par Phil. Ajouter du parallélisme à celui-ci est une évidence dans bash si vous utilisez xargs pour l'appel.
Voici le code:
xargs -n1 -P 10 curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' < url.lst
-n1 : n'utilise qu'une seule valeur (de la liste) comme argument à l'appel curl
-P10 : Gardez 10 processus curl actifs à tout moment (soit 10 connexions parallèles)
Vérifiez le
write_out
paramètre dans le manuel de curl pour plus de données que vous pouvez extraire en l'utilisant (heures, etc.).Au cas où cela aiderait quelqu'un, voici l'appel que j'utilise actuellement:
xargs -n1 -P 10 curl -o /dev/null --silent --head --write-out '%{url_effective};%{http_code};%{time_total};%{time_namelookup};%{time_connect};%{size_download};%{speed_download}\n' < url.lst | tee results.csv
Il génère simplement un tas de données dans un fichier csv qui peut être importé dans n'importe quel outil de bureau.
la source
Celui-ci repose sur une diffusion largement disponible
wget
, présente presque partout, même sur Alpine Linux.wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'
Les explications sont les suivantes:
--quiet
--spider
--server-response
Ce qu'ils ne disent pas,
--server-response
c'est que ces en-têtes sont affichés en erreur standard (sterr) , d'où la nécessité de rediriger vers stdin.La sortie envoyée à l'entrée standard, nous pouvons la diriger vers
awk
pour extraire le code d'état HTTP. Ce code est:$2
) groupe de caractères non vide:{$2}
NR==1
Et parce que nous voulons imprimer ...
{print $2}
.wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'
la source
2>&1 | head -1 | awk '{ print $2 }'
Utilisez
curl
pour récupérer uniquement l'en-tête HTTP (pas le fichier entier) et l'analyser:$ curl -I --stderr /dev/null http://www.google.co.uk/index.html | head -1 | cut -d' ' -f2 200
la source
-I
indicateur amène curl à faire une requête HTTP HEAD, qui est traitée séparément d'un HTTP GET normal par certains serveurs et peut donc renvoyer des valeurs différentes. La commande devrait toujours fonctionner sans elle.wget -S -i *file*
vous obtiendrez les en-têtes de chaque URL dans un fichier.Filtrez cependant
grep
pour le code d'état spécifiquement.la source
J'ai trouvé un outil "webchk" écrit en Python. Renvoie un code d'état pour une liste d'urls. Https://pypi.org/project/webchk/
La sortie ressemble à ceci:
▶ webchk -i ./dxieu.txt | grep '200' http://salesforce-case-status.dxi.eu/login ... 200 OK (0.108) https://support.dxi.eu/hc/en-gb ... 200 OK (0.389) https://support.dxi.eu/hc/en-gb ... 200 OK (0.401)
J'espère que ça t'as aidé!
la source
En raison de https://mywiki.wooledge.org/BashPitfalls#Non-atomic_writes_with_xargs_-P (sortie de travaux parallèles dans les
xargs
risques d'être mélangés), j'utiliserais GNU Parallel au lieu dexargs
paralléliser:cat url.lst | parallel -P0 -q curl -o /dev/null --silent --head --write-out '%{url_effective}: %{http_code}\n' > outfile
Dans ce cas particulier, il peut être sûr d'utiliser
xargs
parce que la sortie est si courte, donc le problème avec l'utilisationxargs
est plutôt que si quelqu'un change plus tard le code pour faire quelque chose de plus grand, il ne sera plus sûr. Ou si quelqu'un lit cette question et pense qu'il peut la remplacercurl
par autre chose, cela peut également ne pas être sûr.la source