Es gibt sicherlich einen anderen Weg - aber dies erfordert Verständnis dafür, was tatsächlich passiert, wenn eine Anfrage über das Internet gestellt wird. Wenn Sie eine Seite in Ihrem Webbrowser besuchen, werden Daten mithilfe eines Protokolls namens HTTP übertragen (ja, aus diesem Grund werden diese häufig http://
am Anfang von URLs angezeigt).
HTTP ist ein textbasiertes Protokoll. Informationen werden zwischen dem Client und dem Server ausgetauscht, indem Header gefolgt vom Hauptteil der Anforderung gesendet werden. Die Header enthalten viele Statusinformationen über die Anforderung und die übertragenen Informationen. Der Header, an dem Sie interessiert sind, um Ihnen bei Ihrem Problem zu helfen, ist eigentlich gar kein Header - es ist die allererste übertragene Zeile und enthält eine Nummer namens Statuscode. Diese Nummer ist dreistellig und vermittelt Statusinformationen. Wenn eine Anfrage erfolgreich war, ist das Ergebnis normalerweise 200 (nicht immer - es gibt Ausnahmen).
Eines ist sicher: Wenn die von Ihnen angeforderte Datei nicht auf dem Webserver vorhanden ist, sollte der Server mit dem Statuscode 404 antworten. Dies zeigt an, dass die Ressource nicht gefunden wurde. (Für Neugierige gibt es hier eine Liste der HTTP-Statuscodes und ihrer Bedeutung.)
Nun, genug Theorie. Mal sehen, wie wir das auf dem Terminal machen können. Ein großartiges Tool zum Abrufen von Anforderungen über HTTP, mit dem wir auch den Statuscode überprüfen können, ist cURL, das in den Ubuntu-Repos verfügbar ist. Sie können es installieren mit:
sudo apt-get install curl
Sobald Sie es installiert haben, können Sie es wie folgt aufrufen:
curl [website]
... und der Inhalt der angegebenen URL wird auf dem Terminal gedruckt. Dies sind die Informationen, die Ihr Webbrowser sieht, wenn er diese URL besucht. Wie hilft uns das? Schauen Sie sich die Flags für den curl
Befehl genau an . Wenn wir den Parameter übergeben --head
, gibt cURL nur die Header der Anforderung zurück. Versuchen Sie es mit einer URL. Sie erhalten eine Liste der Zeilen des Formulars:
header-name: header-value
Beachten Sie natürlich, dass die allererste Zeile nicht so aussieht. Erinnern Sie sich an den Statuscode, über den wir zuvor gesprochen haben? Sie werden es in der ersten Zeile als dreistellige Zahl bemerken. Was wir jetzt tun müssen, ist, es mit Perl aus der ersten Zeile zu extrahieren - und wir können es im Terminal mit dem Perl- -e
Flag tun, wodurch wir den Perl-Code direkt an den Perl-Interpreter übergeben können. Wir müssen cURL ( --silent
) auch ein zusätzliches Flag hinzufügen , damit es keinen Fortschrittsbalken anzeigt und unser Perl-Skript durcheinander bringt.
Folgendes brauchen wir ... es ist ziemlich kompliziert, weil viel davon aus der Hülle entkommen muss:
perl -e "\ $ s = \` curl [URL] --head --silent \ `; \ $ s = ~ m / (\\ d {3}) /; print \ $ 1"
Grundsätzlich wird die URL mit cURL abgerufen und über einen regulären Perl-Ausdruck ausgeführt, der den Statuscode extrahiert und ausdruckt.
Jetzt müssen Sie nur noch die URL der Datei eingeben, nach der Sie suchen, und sie mit '404' vergleichen. Wenn Sie '404' erhalten, können Sie davon ausgehen, dass die Datei nicht vorhanden ist.
Natürlich kann es sehr schwierig sein, dies im Terminal zu manipulieren. Sie können also ein kleines Skript schreiben, das dies nicht nur verständlicher, sondern auch einfacher auszuführen macht:
#!/usr/bin/perl
# Get the URL
$url = $ARGV[0];
# Fetch the header
$header = `curl $url --head --silent`;
# Try to find the status code
$header =~ m/(\d{3})/;
# Return the result
exit(0) if $1 == 404;
exit(1);
Kopieren Sie das einfach und fügen Sie es in eine Datei ein. In diesem Beispiel rufe ich die Datei auf url_check
. Dann machen Sie die Datei ausführbar mit:
chmod 755 url_check
Anschließend können Sie jede Datei mit dem folgenden einfachen Befehl überprüfen:
./url_check [URL]
Der Rückgabewert ist '0', wenn der Server eine 404 und andernfalls '1' zurückgegeben hat. Sie können diesen Befehl dann wie jeden anderen Befehl in der Shell verketten.
ping
überhaupt keine HTTP-Anfragen gesendet werden.ping
Verwendet vielmehr ein Protokoll namens "ICMP", um festzustellen, ob ein Host erreichbar ist, und um die Latenz zu überprüfen.