script pour obtenir le code d’état HTTP d’une liste d’urls?

J’ai une liste d’URL que je dois vérifier, pour voir si elles fonctionnent toujours ou non. Je voudrais écrire un script bash qui fait ça pour moi.

Je n’ai besoin que du code de statut HTTP renvoyé, à savoir 200, 404, 500 et ainsi de suite. Rien de plus.

EDIT Notez qu’il existe un problème si la page indique “404 not found” mais renvoie un message 200 OK. C’est un serveur Web mal configuré, mais vous devrez peut-être envisager ce cas.

Pour plus d’informations à ce sujet, voir Vérifier si une URL va sur une page contenant le texte “404”

Curl a une option spécifique, --write-out , pour cela:

 $ curl -o /dev/null --silent --head --write-out '%{http_code}\n'  200 
  • -o /dev/null rejette la sortie habituelle
  • --silent jette le compteur de progression
  • --head crée une requête HTTP HEAD, au lieu de GET
  • --write-out '%{http_code}\n' imprime le code d’état requirejs

Pour terminer ceci 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 de boucle par URL, ce qui impose des pénalités de connexion à la fourche et TCP. Il 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 monstrueuse des options que curl nécessite pour ce faire.)

 wget --spider -S "http://url/to/be/checked" 2>&1 | grep "HTTP/" | awk '{print $2}' 

imprime uniquement le code de statut pour vous

Étendre la réponse déjà fournie par Phil. Ajouter du parallélisme à cela est une évidence en 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 pour l'appel curl

-P10 : conserver 10 processus curl à tout moment (c.-à-d. 10 connexions parallèles)

Vérifiez le paramètre write_out dans le manuel de curl pour plus de données que vous pouvez extraire en l'utilisant (fois, 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 pouvant être importé dans n'importe quel outil bureautique.

Utilisez curl pour récupérer uniquement l’en-tête HTTP (pas l’intégralité du fichier) et l’parsingr:

 $ curl -I --stderr /dev/null http://www.google.co.uk/index.html | head -1 | cut -d' ' -f2 200 

wget -S -i *file* vous obtiendrez les en-têtes de chaque URL dans un fichier.

Filtrer si grep pour le code d’état en particulier.