Wie erkenne ich eine Datei über das Internet mit Ping oder einem ähnlichen Befehl?

10

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.zipexistiert oder nicht. Ich habe versucht, pingBefehl zu verwenden, aber es zeigt Fehler, ich denke, weil /Zeichen.

Kann mir jemand helfen? oder gibt es einen anderen weg

Egy Mohammad Erdin
quelle
Es ist zu beachten, dass pingüberhaupt keine HTTP-Anfragen gesendet werden. pingVerwendet vielmehr ein Protokoll namens "ICMP", um festzustellen, ob ein Host erreichbar ist, und um die Latenz zu überprüfen.
Nathan Osman

Antworten:

8

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 curlBefehl 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- -eFlag 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.

Nathan Osman
quelle
Vielen Dank für die Theorie und die Lösung, ... aber der Perl-Teil, ... ich frage mich, ob ich es nur mit einem einfachen Shell-Skript machen kann, ... über die Arbeit, ...
Egy Mohammad Erdin
@Warung: Nun ... ein Shell-Skript muss einen externen Befehl aufrufen, um nicht nur eine Remote-URL abzufragen, sondern auch die Antwort zu analysieren.
Nathan Osman
yups ... und mybe ich kann versuchen, die Antwort mit cutBefehlen zu analysieren ... aber immer noch nicht zu funktionieren, .. im Moment mache ich es einfach so, wie du es getan hast ..
Egy Mohammad Erdin
@ WarungNasi49: so etwas wie curl $url --head --silent | head -n 1 | cut -d ' ' -f 2?
Zpea
@ GeorgeEdison: Schöne Antwort! Wie Sie bereits erwähnt haben, zitieren Sie den Perl-Code aus bash: Sie können viele Backslashes entfernen, wenn Sie einfache Anführungszeichen ( ') anstelle von doppelten Anführungszeichen ( ") um Ihren Perl-Ausdruck verwenden.
Zpea
13

Sie können die --spiderOption 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 OKob die Datei vorhanden ist, oder einen Fehler, z. B. 404 Not Foundwenn sie nicht vorhanden ist oder 403 Forbiddenob Sie keine Berechtigung zum Abrufen haben.

Marios Zindilis
quelle
1
wget http://192.168.1.1/backup/01012011.zip

Ergebniscode 0 bedeutet ja, etwas anderes - nein.

Sie können den Ergebniscode im Skript mit einer $?Variablen überprüfen .

mikhailgarber
quelle
1
Hey Mikail! Die Interpretation der Rückgabewerte ist eine gute Idee. Dieser Befehl würde jedoch die gesamte Datei herunterladen und nicht nur prüfen, ob sie verfügbar ist.
Zpea