Kann ich cURL mit einem ExitCode abweichend von 0 ausfallen lassen, wenn der HTTP-Statuscode nicht 200 ist?

74408
knocte

Ich war immer davon ausgegangen, dass curl, wenn es eine HTTP-500-Antwort erhielt, einen Exit-Code zurückgab, der einen Fehler bedeutete (! = 0). Dies scheint jedoch nicht der Fall zu sein.

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

172

3 Antworten auf die Frage

197
rampion

curl --fail macht einen Teil von dem, was Sie wollen:

von man curl:

-f, --fail

(HTTP) Fehler bei Serverfehlern im Hintergrund (keine Ausgabe). Dies geschieht meistens, um Skripts usw. besser zu aktivieren, um fehlgeschlagene Versuche zu bewältigen. Im Normalfall liefert ein HTTP-Server ein Dokument nicht aus. In diesem Fall wird ein HTML-Dokument zurückgegeben, das dies angibt (was oft auch den Grund und mehr beschreibt). Dieses Flag verhindert, dass curl das ausgibt, und gibt den Fehler 22 zurück.

Diese Methode ist nicht ausfallsicher und es gibt Fälle, in denen nicht erfolgreiche Antwortcodes durchgleiten, insbesondere wenn die Authentifizierung betroffen ist (Antwortcodes 401 und 407).

Es blockiert jedoch die Ausgabe auf dem Bildschirm.

Welche Teile macht es und nicht? rogerdpack vor 7 Jahren 2
@rogerdpack tl; dr gibt ungleich Null zurück, wenn eine schlechte Antwort erkannt wird, aber die Antwort wird von OP nicht erfasst rampion vor 7 Jahren 3
Dies fängt HTTP 301 Move Permanently nicht ab. curl gab immer noch den Exit-Code 0 an. wisbucky vor 5 Jahren 0
@wisbucky 301 ist kein Fehler, es ist ein Statuscode für die Weiterleitung. Fehler sind die Statuscodes 4xx und 5xx. M. Justin vor 5 Jahren 1
70
Dennis

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

STATUSCODE=$(curl --silent --output /dev/stderr --write-out "%" 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 STATUSCODE zugewiesen werden kann .

Wie wäre es, wenn ich die Antwort bei einem Fehler * (nicht 200) * ausgeben möchte, aber einen Nicht-0-Statuscode aus dem Skript zurückgeben würde? Justin vor 9 Jahren 3
@ Justin: Was ist mit `if [" $ statuscode "-ne 200]; dann beenden Sie "$ statuscode"; fi` ghoti vor 8 Jahren 1
@ghoti: Es werden nur vorzeichenlose 8-Bit-Beendigungscodes unterstützt, sodass dies etwas verwirrend werden kann. Dennis vor 8 Jahren 4
Ah, richtig - und die Codes werden mit 8 Bit umbrochen, so dass der Fehler 404 zum Ausgangswert 148 wird, der Wert 500 zu 244. Verwirrend! :-) ghoti vor 8 Jahren 3
Als geringfügige Variation erfasst dies den Code in einer Variablen, während die Antwort auf stdout umgeleitet wird, nicht auf stderr: ` 2> & 1` Der Trick ist `{...} 2> & 1`, der das Umleiten erlaubt, während keine andere Shell als '(...)` erscheint. Tobia vor 6 Jahren 6
In ähnlicher Weise könnten Sie an awk weiterleiten, anstatt sie in ein Skript einzubinden: curl -w \ n% --silent $ URL | awk ENDE / ^ 200 $ / '` rampion vor 6 Jahren 0
14
rcdmk

Ich konnte es mit einer Kombination von Flags machen:

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

--silent verbirgt den Fortschritt und Fehler
--show-error zeigt die Fehlermeldung an, die von --silent
--fail ausgeblendet wird, und gibt einen Beendigungscode > 0 zurück, wenn die Anforderung fehlschlägt

Dies zeigt keine Serverantwort. Ich bin kein OP, aber ich vermute, dass er eine Fehlermeldung vom Server sehen wollte, die im Body zurückgegeben wird. Abgesehen davon funktioniert "--silent --show-error --fail" genauso wie "-f / - fail". waste vor 6 Jahren 2
Tatsächlich gibt "--fail" den Exit-Code "22" zurück ([dokumentiert] (https://ec.haxx.se/usingcurl-returns.html). Quolonel Questions vor 6 Jahren 1
Dies fängt HTTP 301 Move Permanently nicht ab. curl gab immer noch den Exit-Code 0 an. wisbucky vor 5 Jahren 0
@wisbucky 301 ist kein Fehler, es ist ein Statuscode für die Weiterleitung. Fehler sind die Statuscodes 4xx und 5xx. M. Justin vor 5 Jahren 1
Um @wisbucky gerecht zu werden, lautet die ursprüngliche Frage _ "[...] wenn der HTTP-Statuscode nicht 200" _ ist. Keine Erwähnung irgendwo vor "Fehler". ken vor 5 Jahren 1