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"
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 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 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.)
wget --spider -S "http://url/to/be/checked" 2>&1 | grep "HTTP/" | awk '{print $2}'
imprime seulement le code de statut pour vous
É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.
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:
$2
) groupe de caractères non vide: {$2}
NR==1
Et parce que nous voulons l’imprimer ... {print $2}
.
wget --server-response --spider --quiet "${url}" 2>&1 | awk 'NR==1{print $2}'
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
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.