Ich habe ein Shell-Skript, mit dem ich einige meiner Inhalte über das Internet herunterladen kann. Wie kann ich feststellen, ob eine Datei über das Internet vorhanden ist? Nehmen wir an, ich möchte wissen, ob es http://192.168.1.1/backup/01012011.zip
existiert oder nicht. Ich habe versucht, ping
Befehl zu verwenden, aber es zeigt Fehler, ich denke, weil /
Zeichen.
Kann mir jemand helfen? oder gibt es einen anderen weg
command-line
scripts
ping
Egy Mohammad Erdin
quelle
quelle
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.Antworten:
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:
Sobald Sie es installiert haben, können Sie es wie folgt aufrufen:
... 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: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:
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:
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:Anschließend können Sie jede Datei mit dem folgenden einfachen Befehl überprüfen:
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.
quelle
cut
Befehlen zu analysieren ... aber immer noch nicht zu funktionieren, .. im Moment mache ich es einfach so, wie du es getan hast ..curl $url --head --silent | head -n 1 | cut -d ' ' -f 2
?'
) anstelle von doppelten Anführungszeichen ("
) um Ihren Perl-Ausdruck verwenden.Sie können die
--spider
Option wget verwenden, mit der die Datei nicht heruntergeladen wird, sondern nur überprüft wird, ob sie vorhanden ist. In Ihrem Beispiel:wget --spider http://192.168.1.1/backup/01012011.zip
Dies gibt entweder eine Nachricht zurück, die enthält,
200 OK
ob die Datei vorhanden ist, oder einen Fehler, z. B.404 Not Found
wenn sie nicht vorhanden ist oder403 Forbidden
ob Sie keine Berechtigung zum Abrufen haben.quelle
Ergebniscode 0 bedeutet ja, etwas anderes - nein.
Sie können den Ergebniscode im Skript mit einer
$?
Variablen überprüfen .quelle