Frage Kann ich cURL mit einem anderen exitCode als 0 fehlschlagen lassen, wenn der HTTP-Statuscode nicht 200 ist?


Ich nahm immer an, dass, wenn curl eine HTTP 500-Antwort bekam, es einen Exit-Code zurückgab, der einen Fehler (! = 0) bedeutete, aber das scheint zu sein nicht der Fall.

Gibt es eine Möglichkeit, dass ich cURL mit einem exitCode, der anders als 0 ist, scheitern lassen kann, wenn der HTTP-Statuscode nicht 200 ist? Ich weiß, dass ich es gebrauchen kann -w "%{http_code}" aber das bringt es in STDOUT, nicht als Exit-Code (außerdem bin ich auch daran interessiert, die Ausgabe zu erfassen, die ich nicht in eine Datei, sondern auf den Bildschirm umleiten möchte).


160
2018-05-01 12:37


Ursprung




Antworten:


curl --fail macht einen Teil von dem was du willst:

von man curl:

-f, --fail

(HTTP) Fehlgeschlagen bei Serverfehlern (keine Ausgabe). Dies wird hauptsächlich getan, um Skripte besser zu aktivieren, um gescheiterte Versuche besser zu bewältigen. In normalen Fällen, wenn ein HTTP-Server ein Dokument nicht liefern kann, gibt es ein HTML-Dokument zurück, das dies angibt (was oft auch warum und mehr beschreibt). Dieses Flag verhindert, dass die Krümmung dieses ausgibt, und gibt den Fehler 22 zurück.

Diese Methode ist nicht fehlersicher und es gibt Gelegenheiten, bei denen nicht erfolgreiche Antwortcodes durchgehen, insbesondere wenn eine Authentifizierung involviert ist (Antwortcodes 401 und 407).

Aber es blockiert die Ausgabe auf dem Bildschirm.


178
2017-10-10 18:36



Also welche Teile macht es und nicht? - rogerdpack
@rogerdpack tl; dr es gibt einen Wert ungleich Null zurück, wenn es eine schlechte Antwort erkennt, aber es würde OP nicht die Antwort erfassen lassen - rampion
Dies fängt HTTP 301 Move Permanent nicht ab. Curl gab immer noch den Exit-Code 0. - wisbucky
@wisbucky 301 ist kein Fehler, es ist ein Umleitungsstatuscode. Fehler sind 4xx und 5xx Statuscodes. - M. Justin


Wenn Sie nur den Inhalt der gewellten Seite anzeigen möchten, können Sie dies tun:

STATUSCODE=$(curl --silent --output /dev/stderr --write-out "%{http_code}" URL)

if test $STATUSCODE -ne 200; then
    # error handling
fi

Dadurch wird der Inhalt der Seite in STDERR geschrieben, während der HTTP-Statuscode in STDOUT geschrieben wird, sodass er der Variablen zugewiesen werden kann STATUSCODE.


61
2018-05-01 15:31



Wie wäre es, wenn ich die Antwort bei einem Fehler ausgeben möchte (nicht 200), aber gib ein Non zurück 0 Statuscode vom Skript? - Justin
@ Justin: Was ist mit if [ "$statuscode" -ne 200 ]; then exit "$statuscode"; fi ? - ghoti
@ghoti: Es werden nur vorzeichenlose 8-Bit-Exit-Codes unterstützt, so dass es etwas verwirrend werden kann. - Dennis
Ah, richtig - und Codes werden mit 8 Bits umgebrochen, also wird der Fehler 404 zum Ausgangswert 148, 500 wird zu 244. In der Tat verwirrend! :-) - ghoti
Als kleine Variation erfasst dies den Code in einer Variablen und leitet die Antwort an stdout, nicht an stderr weiter: { code=$(curl ... as above ...); } 2>&1 Der Trick ist { ... } 2>&1 Dies ermöglicht das Umleiten, ohne dass eine andere Shell erstellt wird ( ... ) würde. - Tobia


Ich konnte das mit einer Kombination von Flags machen:

curl --silent --show-error --fail URL

--Leise verbirgt den Fortschritt und den Fehler
--show-Fehler zeigt die Fehlermeldung versteckt von --silent
--Scheitern Gibt einen Exit-Code> 0 zurück, wenn die Anfrage fehlschlägt


11
2017-09-12 14:48



Dies zeigt keine Serverantwort an. Ich bin nicht OP, aber ich vermute, er wollte eine Fehlermeldung vom Server sehen, die in Körper zurückgegeben wird. Neben einem --silent --show-error --fail funktioniert genauso wie nur -f/--fail. - waste
Tatsächlich, --fail Gibt den Beendigungscode zurück 22, wie dokumentiert. - Quolonel Questions
Dies fängt HTTP 301 Move Permanent nicht ab. Curl gab immer noch den Exit-Code 0. - wisbucky
@wisbucky 301 ist kein Fehler, es ist ein Umleitungsstatuscode. Fehler sind 4xx und 5xx Statuscodes. - M. Justin