web-dev-qa-db-fra.com

Obtenez la sortie de la page avec curl --fail

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.

34
Thom Thom Thom

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 .

18
Sabuj Hassan

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
6
Subhas

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

Explication

-o - -w "\n%{http_code}\n" - imprime sur stdout (en fait, il est redirigé vers la commande suivante) avec le code d'état à la fin
tee - la sortie sera redirigée vers la commande suivante et imprimée en plus vers stdout
tail -n 1 - extrait le code d'état de la dernière ligne
cmp <(echo 2xx) - comparer le code d'état, premier caractère uniquement
grep "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)

2
timaschew