web-dev-qa-db-ja.com

curl --failでページ出力を取得する

パラメータなしでcurlを呼び出すと、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

ステータスコードは0です。

--failを指定して呼び出しても、出力は表示されません。

$ curl --fail http://www.google.com/linux;
curl: (22) The requested URL returned error: 404 Not Found

$ echo $?;
22

ステータスコードは22になりました...

Id 'は、http status = 404、500(最初のcurl実行のように)でも出力を取得し、同時に別のシステムエラー(2番目のcurl実行のように、$?= 22)を取得します。 curlで可能ですか?そうでない場合、どうすれば別のツールでこれを達成できますか(このツールはファイルのアップロードと投稿データを受け入れる必要があります!wgetは代替手段ではないようです...)

ありがとう。

34
Thom Thom Thom

まず、エラーコード(または終了コード)の最大値は255です。 参照 です。

また、--failでは、探していることを実行できません。ただし、別の方法(シェルスクリプトの記述)を使用してシナリオを処理できますが、それが効果的かどうかはわかりません!

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

$?を実行すると、そこから終了コードを取得できます。

応答HTMLはout.htmlファイル内にあります。

URLをコマンドライン引数としてスクリプトに渡すこともできます。 ここをチェック

18
Sabuj Hassan

残念ながらcurlでは不可能です。しかし、wgetでこれを行うことができます。

$ wget --content-on-error -qO- http://httpbin.org/status/418

    -=[ teapot ]=-

       _...._
     .'  _ _ `.
    | ."` ^ `". _,
    \_;`"---"`|//
      |       ;/
      \_     _/
        `"""`
$ echo $?
8
6
Subhas

Wgetはmultipart/form-dataの送信に適していないため、解決策を見つけました。

_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"_-stdout(実際には次のコマンドにパイプされます)に出力し、最後にステータスコードを出力します
tee-出力は次のコマンドにパイプされ、さらに標準出力に出力されます
_tail -n 1_-最後の行からステータスコードを抽出します
cmp <(echo 2xx) -ステータスコードの比較、最初の文字のみ
_grep "char 2"_-最初の文字を2にする必要がある場合、そうでなければ失敗する

シェルスクリプトでは、より良い比較を行うこともできます(現在は2xxのみが許可されているため、300のようなリダイレクトはcmpでエラーとして処理されます)

2
timaschew