Ich habe eine Liste von URLs, die ich überprüfen muss, um festzustellen, ob sie noch funktionieren oder nicht. Ich möchte ein Bash-Skript schreiben, das das für mich erledigt.
Ich benötige nur den zurückgegebenen HTTP-Statuscode, dh 200, 404, 500 usw. Nichts mehr.
BEARBEITEN Beachten Sie, dass ein Problem auftritt , wenn auf der Seite "404 nicht gefunden" angezeigt wird, aber die Meldung "200 OK" zurückgegeben wird. Es ist ein falsch konfigurierter Webserver, aber Sie müssen diesen Fall möglicherweise berücksichtigen.
Weitere Informationen hierzu finden Sie unter Überprüfen, ob eine URL zu einer Seite mit dem Text "404" führt.
bash
curl
http-status-codes
Manu
quelle
quelle
Antworten:
Curl hat dafür eine spezielle Option
--write-out
:-o /dev/null
wirft die übliche Ausgabe weg--silent
wirft die Fortschrittsanzeige weg--head
macht eine HEAD HTTP-Anfrage anstelle von GET--write-out '%{http_code}\n'
druckt den erforderlichen StatuscodeSo schließen Sie dies in ein vollständiges Bash-Skript ein:
(Leser mit Adleraugen werden feststellen, dass hierfür ein Curl-Prozess pro URL verwendet wird, was zu Gabelungs- und TCP-Verbindungsstrafen führt. Es wäre schneller, wenn mehrere URLs in einem einzigen Curl kombiniert würden, aber es gibt keinen Platz, um die monströse Wiederholung aufzuschreiben von Optionen, die Curl benötigt, um dies zu tun.)
quelle
http://example.com/\r
beim Durchlaufen der Schleifedruckt nur den Statuscode für Sie
quelle
Erweiterung der Antwort von Phil. Das Hinzufügen von Parallelität ist ein Kinderspiel, wenn Sie xargs für den Aufruf verwenden.
Hier der Code:
-n1 : Verwenden Sie nur einen Wert (aus der Liste) als Argument für den Curl-Aufruf
-P10 : Halten Sie jederzeit 10 Curl-Prozesse am Leben (dh 10 parallele Verbindungen)
Überprüfen Sie den
write_out
Parameter im Handbuch von curl auf weitere Daten, die Sie damit extrahieren können (Zeiten usw.).Falls es jemandem hilft, ist dies der Anruf, den ich gerade verwende:
Es gibt nur eine Reihe von Daten in eine CSV-Datei aus, die in jedes Office-Tool importiert werden kann.
quelle
Dies beruht auf weit verbreiteten
wget
, fast überall vorhandenen, sogar auf Alpine Linux.Die Erklärungen lauten wie folgt:
--quiet
--spider
--server-response
Was sie nicht sagen,
--server-response
ist, dass diese Header-Ausgaben auf Standardfehler (sterr) gedruckt werden , daher muss auf stdin umgeleitet werden .Die Ausgabe, die an die Standardeingabe gesendet wird, kann weitergeleitet werden
awk
, um den HTTP-Statuscode zu extrahieren. Dieser Code lautet:$2
) nicht leere Gruppe von Zeichen:{$2}
NR==1
Und weil wir es drucken möchten ...
{print $2}
.quelle
2>&1 | head -1 | awk '{ print $2 }'
Verwenden Sie
curl
diese Option, um nur den HTTP-Header (nicht die gesamte Datei) abzurufen und zu analysieren:quelle
-I
Flag bewirkt, dass Curl eine HTTP-HEAD-Anforderung ausführt, die von einigen Servern getrennt von einem normalen HTTP-GET behandelt wird und daher unterschiedliche Werte zurückgeben kann. Der Befehl sollte weiterhin ohne ihn funktionieren.wget -S -i *file*
Sie erhalten die Header von jeder URL in einer Datei.Filtern Sie jedoch
grep
speziell nach dem Statuscode.quelle
Ich habe ein in Python geschriebenes Tool "webchk" gefunden. Gibt einen Statuscode für eine Liste von URLs zurück. Https://pypi.org/project/webchk/
Die Ausgabe sieht folgendermaßen aus:
Hoffentlich hilft das!
quelle
Aufgrund von https://mywiki.wooledge.org/BashPitfalls#Non-atomic_writes_with_xargs_-P (Ausgabe von parallelen Jobs bei
xargs
gemischten Risiken) würde ich GNU Parallel verwenden, anstattxargs
zu parallelisieren:In diesem speziellen Fall kann die Verwendung sicher sein,
xargs
da die Ausgabe so kurz ist. Das Problem bei der Verwendungxargs
besteht daher eher darin, dass sie später nicht mehr sicher ist, wenn jemand später den Code ändert, um etwas Größeres zu tun. Oder wenn jemand diese Frage liest und glaubt, sie durchcurl
etwas anderes ersetzen zu können, ist dies möglicherweise auch nicht sicher.quelle