it-swarm.com.de

Wie erkennt man eine Datei über das Internet mit Ping oder einem ähnlichen Befehl?

Ich habe ein Shell-Skript, mit dem ich einige meiner Inhalte über das Internet herunterladen kann. Woher weiß ich, ob eine Datei über das Internet vorhanden ist? Angenommen, ich möchte wissen, ob _http://192.168.1.1/backup/01012011.Zip_ vorhanden ist oder nicht. Ich habe versucht, den Befehl ping zu verwenden, aber er zeigt einen Fehler an. Ich schätze, das liegt am Zeichen _/_.

Kann mir jemand helfen? oder gibt es einen anderen weg

9

Es gibt sicherlich einen anderen Weg - aber dazu muss man verstehen, 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, daher wird am Anfang von URLs häufig http:// 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. Die Kopfzeile, an der Sie Interesse haben, um Ihr Problem zu lösen, ist eigentlich gar keine Kopfzeile. Sie ist die erste übertragene Zeile und enthält eine Nummer mit dem 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 angeforderte Datei nicht auf dem Webserver vorhanden ist, sollte der Server mit dem Statuscode 404 antworten. Dies weist darauf hin, dass die Ressource nicht gefunden wurde. (Für die Neugierigen ist hier eine Liste von HTTP-Statuscodes und deren Bedeutung.)

Nun, genug Theorie. Mal sehen, wie wir das am Terminal machen können. Ein großartiges Tool zum Abrufen von Anfragen über HTTP, das uns auch die Möglichkeit bietet, den Statuscode zu überprüfen, 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 folgendermaßen aufrufen:

curl [website]

... und der Inhalt der angegebenen URL wird auf das 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 Befehl curl genau an . Übergeben wir den Parameter --head, gibt cURL nur die Header aus der Anfrage zurück . Probieren Sie es mit einer URL. Sie erhalten eine Liste der Zeilen des Formulars:

header-name: header-value

Beachten Sie natürlich, dass die erste Zeile nicht so aussieht. Erinnern Sie sich an den Statuscode, über den wir vorher gesprochen haben? Sie sehen es in der ersten Zeile als dreistellige Zahl. Jetzt müssen wir es mit Perl aus der ersten Zeile extrahieren - und wir können es im Terminal mit Perls -e -Flag tun, mit dem wir den Perl-Code direkt an den Perl-Interpreter übergeben können. Außerdem müssen wir cURL (--silent) ein zusätzliches Flag hinzufügen, damit keine Fortschrittsanzeige angezeigt und unser Perl-Skript nicht durcheinander gebracht wird.

Folgendes brauchen wir ... es ist ziemlich kompliziert, da viel davon aus der Shell entfernt werden muss:

 Perl -e "\ $ s = \` curl [URL] --head --silent\`;\$ s = ~ m/(\\ d {3}) /; print\$ 1 "

Im Grunde genommen wird die URL mit cURL abgerufen und über einen regulären Perl-Ausdruck ausgeführt, der den Statuscode extrahiert und ausgibt.

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 existiert.

Natürlich kann es sehr schwierig sein, dies im Terminal zu manipulieren. Daher können Sie ein kleines Skript schreiben, mit dem dies nicht nur einfacher zu verstehen, sondern auch einfacher auszuführen ist:

#!/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);

Einfach kopieren und in eine Datei einfügen. In diesem Beispiel werde ich die Datei url_check aufrufen. Dann machen Sie die Datei ausführbar mit:

chmod 755 url_check

Dann können Sie jede Datei mit dem folgenden einfachen Befehl überprüfen:

 ./ url_check [URL]

Der Rückgabewert ist "0", wenn der Server "404" zurückgegeben hat, andernfalls "1". Sie können diesen Befehl dann in der Shell wie jeden anderen Befehl verketten.

8
Nathan Osman

Sie können die Option --spider von wget verwenden, mit der die Datei nicht heruntergeladen, sondern nur überprüft wird, ob sie vorhanden ist. In deinem Beispiel:

wget --spider http://192.168.1.1/backup/01012011.Zip

Dies gibt entweder eine Nachricht zurück, die 200 OK enthält, wenn die Datei vorhanden ist, oder einen Fehler, z. 404 Not Found wenn es nicht da ist, oder 403 Forbidden wenn Sie nicht die Erlaubnis haben, es zu bekommen.

12
Marios Zindilis
wget http://192.168.1.1/backup/01012011.Zip

Ergebniscode 0 bedeutet ja, etwas anderes - nein.

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

1
mikhailgarber