109 votes

<script>Script pour obtenir le code de statut HTTP d'une liste d'URLs?</script>

J'ai une liste d'URL que je dois vérifier, pour voir si elles fonctionnent encore ou non. J'aimerais écrire un script bash qui le fasse pour moi.

Je n'ai besoin que du code d'état HTTP retourné, c'est-à-dire 200, 404, 500, etc. Rien de plus.

MODIFIER Notez qu'il y a un problème si la page indique "404 not found" mais renvoie un message 200 OK. Il s'agit d'un serveur web mal configuré, mais vous devrez peut-être tenir compte de ce cas.

Pour en savoir plus, consultez Vérifier si une URL renvoie vers une page contenant le texte "404"

220voto

Phil Points 1780

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 jette la sortie habituelle
  • --silent jette la barre de progression
  • --head envoie une requête HTTP HEAD, au lieu de GET
  • --write-out '%{http_code}\n' imprime le code d'état requis

Pour envelopper tout 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 avisés 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 URLs étaient combinées dans un seul curl, mais il n'y a pas d'espace pour écrire la répétition monstre d'options requise par curl pour faire cela.)

54voto

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

imprime uniquement le code de statut pour vous

36voto

estani Points 1167

Étendre la réponse déjà fournie par Phil. Ajouter du parallélisme à cela est un jeu d'enfant 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 : utilisez juste une valeur (de la liste) comme argument pour l'appel à curl

-P10 : Gardez 10 processus curl actifs à tout moment (c'est-à-dire 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 (temps, etc).

Si cela peut aider 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

Cela affiche simplement une bouchée de données dans un fichier csv qui peut être importé dans tout outil de bureau.

19voto

Salathiel Genèse Points 714

Cela repose sur wget, largement disponible, présent 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

Désactive la sortie de Wget.

Source - pages de manuel de wget

--spider

[ ... ] il ne téléchargera pas les pages, juste vérifier leur présence. [ ... ]

Source - pages de manuel de wget

--server-response

Affiche les en-têtes envoyés par les serveurs HTTP et les réponses envoyées par les serveurs FTP.

Source - pages de manuel de wget

Ce qu'ils ne disent pas à propos de --server-response est que ces en-têtes de sortie sont imprimés sur erreur standard (sterr), d'où la nécessité de rediriger vers stdin.

La sortie envoyée à l'entrée standard, nous pouvons la rediriger vers awk pour extraire le code d'état HTTP. Ce code est :

  • le deuxième groupe de caractères non vides ($2): {$2}
  • sur la toute première ligne de l'en-tête: NR==1

Et parce que nous voulons l'afficher... {print $2}.

wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'

10voto

dogbane Points 85749

Utilisez curl pour récupérer uniquement l'en-tête HTTP (pas tout le fichier) et l'analyser :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X