web-dev-qa-db-fra.com

Script pour obtenir le code de statut HTTP d'une liste d'URL?

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 le fait pour moi.

Je n'ai besoin que du code d'état HTTP renvoyé, à savoir 200, 404, 500, etc. Rien de plus.

[~ # ~] modifier [~ # ~] Notez qu'il y a un problème si la page indique "404 non trouvé" mais renvoie un message 200 OK. . C'est un serveur Web mal configuré, mais vous devrez peut-être prendre en compte ce cas.

Pour plus d'informations à ce sujet, voir Vérifier si une URL se dirige vers une page contenant le texte "404"

81
Manu

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

$ curl -o /dev/null --silent --head --write-out '%{http_code}\n' <url>
200
  • -o /dev/null jette la sortie habituelle
  • --silent jette le compteur de progression
  • --head fait une requête HTTP HEAD, au lieu de GET
  • --write-out '%{http_code}\n' imprime le code de statut requis

Pour 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 pointillés remarqueront que cela utilise un processus de boucle par URL, ce qui impose des pénalités de connexion avec fork et TCP. Cela 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 que curl demande pour cela.)

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

imprime seulement le code de statut pour vous

35
user551168

Étendre la réponse déjà fournie par Phil. L'ajout de parallélisme 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: utilise une seule valeur (dans la liste) comme argument de l'appel curl

- P1: Maintenir 10 processus curl actifs à tout moment (c.-à-d. 10 connexions parallèles)

Vérifier la write_out paramètre dans le manuel de curl pour plus de données que vous pouvez extraire en 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

Il sort simplement un tas de données dans un fichier csv qui peut être importé dans n'importe quel outil de bureau.

27
estani

Cela repose sur wget, largement disponible, présent presque partout, même sous 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 wget

--spider

[...] il ne téléchargera pas les pages, vérifiez simplement qu'elles sont là. [...]

Source - Pages de manuel wget

--server-response

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

Source - Pages de manuel wget

Ce qu'ils ne disent pas à propos de --server-response est que ces en-têtes sont imprimés sur erreur standard (sterr) , d'où la nécessité de redirection sur 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:

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

Et parce que nous voulons l’imprimer ... {print $2}.

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

Utilisez curl pour extraire l’en-tête HTTP uniquement (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
7
dogbane

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

Filtrez bien grep pour le code de statut spécifiquement.

4
colinross