En appelant curl sans paramètres, j'obtiens la sortie de la page, même avec un code d'état http = 404:
$ curl http://www.google.com/linux;
<!DOCTYPE html>
<html lang=en>
<meta charset=utf-8>
<meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
<title>Error 404 (Not Found)!!1</title>
<style>
*{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/errors/logo_sm_2.png) no-repeat}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/errors/logo_sm_2_hr.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/errors/logo_sm_2_hr.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/errors/logo_sm_2_hr.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:55px;width:150px}
</style>
<a href=//www.google.com/><span id=logo aria-label=Google></span></a>
<p><b>404.</b> <ins>That’s an error.</ins>
<p>The requested URL <code>/linux</code> was not found on this server. <ins>That’s all we know.</ins>
$ echo $?;
0
Le code d'état est 0.
L'appeler avec --fail n'affichera pas la sortie:
$ curl --fail http://www.google.com/linux;
curl: (22) The requested URL returned error: 404 Not Found
$ echo $?;
22
Le code d'état est 22 maintenant ...
Je voudrais obtenir la sortie même lorsque http status = 404, 500 (comme la première exécution de curl) et, en même temps, obtenir une erreur système différente (comme dans la deuxième exécution de curl, $? = 22). Est-ce possible avec curl? Sinon, comment pourrais-je y parvenir avec un autre outil (cet outil doit accepter les téléchargements de fichiers et publier les données! Wget ne semble pas être une alternative ...)
Merci.
Tout d'abord, la valeur maximale pour le code d'erreur (ou code de sortie) est 255
. Voici le référence .
Également --fail
ne vous permettra pas de faire ce que vous cherchez. Cependant, vous pouvez utiliser d'autres moyens (écrire un script Shell) pour gérer le scénario, mais vous n'êtes pas sûr qu'il sera efficace ou pas pour vous!
http_code=$(curl -s -o out.html -w '%{http_code}' http://www.google.com/linux;)
if [[ $http_code -eq 200 ]]; then
exit 0
fi
## decide which status you want to return for 404 or 500
exit 204
Maintenant, faites le $?
et vous obtiendrez le code de sortie à partir de là.
Vous trouverez la réponse html dans le out.html
fichier.
Vous pouvez également transmettre l'URL au script comme argument de ligne de commande. Cochez ici .
Malheureusement pas possible avec curl. Mais vous pouvez le faire avec wget.
$ wget --content-on-error -qO- http://httpbin.org/status/418
-=[ teapot ]=-
_...._
.' _ _ `.
| ."` ^ `". _,
\_;`"---"`|//
| ;/
\_ _/
`"""`
$ echo $?
8
J'ai trouvé une solution car wget n'était pas adapté à l'envoi de données en plusieurs parties/formulaires
curl -o - -w "\n%{http_code}\n" http://httpbin.org/status/418 | tee >(tail -n 1 | cmp <(echo 2xx) - ) | tee >(grep "char 2"; echo $? > status-code) && grep 0 status-code
-o - -w "\n%{http_code}\n"
- imprime sur stdout (en fait, il est redirigé vers la commande suivante) avec le code d'état à la fintee
- la sortie sera redirigée vers la commande suivante et imprimée en plus vers stdouttail -n 1
- extrait le code d'état de la dernière lignecmp <(echo 2xx) -
comparer le code d'état, premier caractère uniquementgrep "char 2"
- si le premier caractère doit être 2, sinon échouer
Dans un script Shell, vous pouvez également faire une meilleure comparaison (actuellement, il n'autorise que 2xx, donc les redirections comme 300 sont traitées comme une erreur avec cmp
comment il est utilisé ci-dessus)