Ich benutze curl
an der Befehlszeile unter Linux, um HTTP-Anforderungen auszugeben. Die Antwortkörper werden auf Standardausdruck gedruckt, was in Ordnung ist, aber auf der Manpage kann ich nicht nachvollziehen, wie der HTTP-Statuscode aus der Antwort (404, 403 usw.) gedruckt werden kann. Ist das möglich?
800
-i
Flagge, wie incurl -i https://www.example.com/
, ist wahrscheinlich das, was Sie wollen, wie pro superuser.com/a/514798/190188curl -IL http://www.example.com | grep "^HTTP\/"
?Antworten:
Dies sollte für Sie funktionieren, wenn der Webserver in der Lage ist, auf HEAD-Anfragen zu antworten (dies führt keine aus
GET
):Damit cURL Redirects (3xx-Status) folgen kann, muss zusätzlich -L hinzugefügt werden.
quelle
curl -I
führt eine HEAD-HTTP-Anforderung durch, die zum Testen des HTTP-Statuscodes für einige Webanwendungsserver und -dienste problematisch sein kannhead -n 1|cut -d$' ' -f2
curl -I http://www.example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2
. Fügen Sie -L zum Einrollen hinzu, wenn Sie den endgültigen Status nach Umleitungen benötigen.curl -I -X GET
sendet eine GET-Anfrage, gibt aber die gleiche Ausgabe aus.Eine spezifischere Methode, um nur den HTTP-Statuscode auszudrucken, sieht folgendermaßen aus:
Es ist viel einfacher, mit Skripten zu arbeiten, da keine Analyse erforderlich ist :-)
Der Parameter
-I
kann hinzugefügt werden, um die Leistung beim Laden der Antwort zu verbessern. Dieser Parameter fordert nur Status / Header der Antwort an, ohne den Antworttext herunterzuladen.Hinweis:
%{http_code}
Gibt die erste Zeile der HTTP-Nutzdaten zurückdh:
quelle
/dev/null
Ding funktioniert sogar in der Windows-Version von Curl, die ich verwende.httping -c 1 -s -G -m
gibt ein GET aus und lädt nicht die gesamte Datei herunter, obwohl mir klar ist, dass es bei dieser Frage speziell um Locken geht.-s
= Download-Fortschritt-o /dev/null
nicht anzeigen,-w "%{http_code}"
= Body nicht anzeigen, = HTTP-Antwortcode nach dem Beenden an stdout schreiben.Wenn Sie sowohl die Überschrift als auch das Ergebnis sehen möchten, können Sie die ausführliche Option verwenden:
Der Status wird in der Kopfzeile angezeigt. Z.B
quelle
Sie können den Statuscode zusätzlich zu allen Kopfzeilen wie folgt drucken:
Das Gute daran
-i
ist, dass es auch funktioniert-X POST
.quelle
-i
es funktioniert mit jeder HTTP-Methode, nicht nurGET
undPOST
... :)-s
(Fortschrittsanzeige oder Fehlermeldungen nicht anzeigen) und-S
(Fehlermeldungen immerhinWenn Sie den HTTP-Statuscode in einer Variablen erfassen und dennoch den Inhalt an STDOUT umleiten möchten, müssen Sie zwei STDOUTs erstellen. Dies können Sie mit process substitution> () und command substitution $ () tun .
Erstellen Sie zunächst einen Dateideskriptor
3
für den aktuellen Prozess 'STDOUT mitexec 3>&1
.Dann die Nutzung curl
-o
Option , um den Antwortinhaltes in einen temporären Fifo mit dem Befehl Substitution und dann innerhalb dieses Befehls Substitution, umleiten Ausgabe zurück zu Ihrem aktuellen Prozess STDOUT Dateideskriptors zu umleiten3
mit-o >(cat >&3)
.Alles zusammen
bash
3.2.57(1)-release
(Standard fürmacOS
):Beachten Sie, dass dies nicht funktioniert,
/bin/sh
wie in den Kommentaren unten angegeben .quelle
STDOUT
, daher sollten Sie in der Lage sein, die Ausgabe des Befehls wie bei einem normalen Befehl an eine beliebige Stelle umzuleiten. Ich habe das aber nicht getestet.Curl-Ausgabe neu definieren:
Kann mit jedem Anfragetyp verwendet werden.
quelle
NUR Statuscode
Alles Verdienst dieser GIST
quelle
Dies ist eine schmerzhafte
curl --fail
Einschränkung. Vonman curl
:Aber es gibt keinen Weg , um sowohl den Nicht-Null - Return - Code zu erhalten und den Antworttext in stdout.
Basierend auf der Antwort von pvandenberk und diesem anderen sehr nützlichen Trick, der auf SO gelernt wurde , ist hier eine Problemumgehung:
Diese Funktion verhält sich genau so
curl
, gibt jedochcurl
bei einem HTTP-Code im Bereich [400, 600 [ 127 zurück (ein von nicht verwendeter Rückkehrcode ).quelle
Dadurch wird eine Anfrage an die URL gesendet, nur die erste Zeile der Antwort abgerufen, auf Blöcke aufgeteilt und die zweite ausgewählt.
Es enthält den Antwortcode
quelle
Bei einer POST-Anfrage hat Folgendes funktioniert:
quelle
Verwenden Sie den folgenden cURL-Befehl und leiten Sie ihn an grep weiter:
Hier ist, was jede Flagge tut:
-I
: Nur Antwortheader anzeigen-s
: Lautlos - Fortschrittsbalken nicht anzeigen-L
:Location:
Kopfzeilen folgenHier ist ein Link zu HTTP-Statuscodes .
Führen Sie von der Befehlszeile aus. Diese Locke wird im unbeaufsichtigten Modus ausgeführt, folgt allen Weiterleitungen und ruft die HTTP-Header ab. grep gibt den HTTP-Statuscode in der Standardausgabe aus.
quelle
Dies gibt die folgenden Informationen zurück:
quelle
Hier ist ein Curl-Befehl, der
GET
den HTTP-Code zurückgibt.Bitte denken Sie daran, dass der unten beschriebene Ansatz
HEAD
zwar schneller ist, aber bei einigen Web-weniger kompatiblen HTTP-Servern möglicherweise nicht funktioniert.quelle
Ein Beispiel für die Verwendung der Antwortcodes. Ich verwende dies, um Geolite-Datenbanken nur dann erneut herunterzuladen, wenn sie sich geändert haben (
-z
) und auch folgende Weiterleitungen (-L
):quelle
Das OP möchte den Statuscode wissen. Wenn Sie eine Datei herunterladen, möchten Sie häufig auch ein Gefühl für deren Größe bekommen. Daher verwende ich curl zuerst, um den Statuscode und die Größe der Datei anzuzeigen, und schalte dann die ausführliche und direkte Datei an den gewünschten Ort und Namen aus:
Dann warte ich auf das Ende der Locke
bevor ich den nächsten Befehl ausführen. Das Obige gibt, wenn es in einem Skript mit vielen Befehlen wie oben verwendet wird, eine nette Antwort wie:
Bitte beachten Sie, dass hinter -o in curl der vollständige Pfad der Datei + der Dateiname stehen muss. Auf diese Weise können Sie Dateien in einer sinnvollen Namensstruktur speichern, wenn Sie sie mit Curl d / l. Beachten Sie auch, dass -s und -S zusammen die Ausgabe zum Schweigen bringen, aber Fehler anzeigen. Beachten Sie auch, dass -R versucht, den Zeitstempel der Datei auf den der Webdatei zu setzen.
Meine Antwort basiert auf dem, was @pvandenberk ursprünglich vorgeschlagen hat, aber zusätzlich speichert es die Datei tatsächlich irgendwo, anstatt nur nach / dev / null zu leiten.
quelle
Teilen Sie den Ausgabeinhalt auf
stdout
und den HTTP-Statuscode aufstderr
:Wenn nur der HTTP-Statuscode stderr sein soll,
--silent
kann Folgendes verwendet werden:Der gewünschte Stream kann dann ausgewählt werden, indem unerwünschter Stream weitergeleitet wird an
/dev/null
:Beachten Sie, dass Sie den Befehl curl in der Subshell ausführen müssen, damit sich die zweite Umleitung wie gewünscht verhält.
quelle
bash
eine Prozessersetzung./tmp/out
/tmp/err
Dateien zu unerwarteten Ergebnissen führen kann , wenn parallel laufen.