curl
LinuxのコマンドラインでHTTP要求を発行するために使用しています。応答本文は標準出力に印刷されますが、これは問題ありませんが、応答からHTTPステータスコード(404、403など)を印刷する方法をmanページから見ることはできません。これは可能ですか?
curl -IL http://www.example.com | grep "^HTTP\/"
ですか?
curl
LinuxのコマンドラインでHTTP要求を発行するために使用しています。応答本文は標準出力に印刷されますが、これは問題ありませんが、応答からHTTPステータスコード(404、403など)を印刷する方法をmanページから見ることはできません。これは可能ですか?
curl -IL http://www.example.com | grep "^HTTP\/"
ですか?
回答:
これは、WebサーバーがHEADリクエストに応答できる場合に機能します(これは実行されませんGET
)。
curl -I http://www.example.org
さらに、cURLがリダイレクト(3xxステータス)に従うようにするには、-Lを追加します。
curl -I
HEAD HTTPリクエストを実行します。これは、一部のWebアプリケーションサーバーおよびサービスのHTTPステータスコードのテストに問題が発生する可能性があります
head -n 1|cut -d$' ' -f2
curl -I http://www.example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2
。リダイレクト後に最終ステータスが必要な場合は、-Lをcurlに追加します。
curl -I -X GET
GETリクエストを送信しますが、同じ出力を提供します。
HTTPステータスコードのみを出力するより具体的な方法は、次の行に沿ったものです。
curl -s -o /dev/null -w "%{http_code}" http://www.example.org/
解析を必要としないため、スクリプトでの作業がはるかに簡単です:-)
パラメーター-I
は、応答負荷パフォーマンスを改善するために追加される場合があります。このパラメーターは、応答のステータス/ヘッダーを要求するだけで、ダウンロードの応答本文はありません。
注: %{http_code}
HTTPペイロードの最初の行に戻ります
すなわち:
curl -s -o /dev/null -I -w "%{http_code}" http://www.example.org/
/dev/null
は私が使用しているWindowsバージョンのcurlでも動作します。
httping -c 1 -s -G -m
GETを発行し、ファイル全体をダウンロードしませんが、この質問は具体的にcurlについてのものであると認識しています。
-s
=ダウンロードの進行状況を-o /dev/null
表示しない、-w "%{http_code}"
= 本文を表示しない、=終了後にHTTP応答コードをstdoutに書き込む。
結果だけでなくヘッダーも表示する場合は、verboseオプションを使用できます。
curl -v http://www.example.org
curl --verbose http://www.example.org
ステータスがヘッダーに表示されます。例えば
< Date: Tue, 04 Nov 2014 19:12:59 GMT
< Content-Type: application/json; charset=utf-8
< Status: 422 Unprocessable Entity
以下を実行することにより、すべてのヘッダーに加えてステータスコードを印刷できます。
curl -i http://example.org
良い点-i
は、-X POST
同様に機能することです。
-i
が、 HTTPメソッドだけでなくGET
、POST
... でも機能します:)
-s
(進行状況メーターやエラーメッセージを表示しない)および-S
(結局エラーメッセージを表示する)と一緒に使用できます
HTTPステータスコードを変数にキャプチャしつつ、コンテンツをSTDOUTにリダイレクトする場合は、2つのSTDOUTを作成する必要があります。そのためには、プロセス置換>()およびコマンド置換$()を使用します。
まず、を使用し3
て、現在のプロセスのSTDOUTのファイル記述子を作成しますexec 3>&1
。
その後、カールの使用-o
コマンド置換を使用して、一時FIFOに応答内容をリダイレクトして、そのコマンド置換中に、戻ってあなたの現在のプロセスのSTDOUTのファイル記述子への出力をリダイレクトするためのオプション3
では-o >(cat >&3)
。
すべてをまとめてbash
3.2.57(1)-release
(標準macOS
):
# creates a new file descriptor 3 that redirects to 1 (STDOUT)
exec 3>&1
# Run curl in a separate command, capturing output of -w "%{http_code}" into HTTP_STATUS
# and sending the content to this command's STDOUT with -o >(cat >&3)
HTTP_STATUS=$(curl -w "%{http_code}" -o >(cat >&3) 'http://example.com')
これはで動作しないことに注意してください/bin/sh
としてSamKは以下のコメントで述べました。
STDOUT
あるため、コマンドからの出力を通常のコマンドと同じように好きな場所にリダイレクトできるはずです。ただし、これはテストしていません。
curl出力の再定義:
curl -sw '%{http_code}' http://example.org
任意の要求タイプで使用できます。
これは苦痛なcurl --fail
制限です。からman curl
:
-f、-fail(HTTP)サーバーエラーでサイレントに失敗します(まったく出力されません)
ただし、ゼロ以外の戻りコードと stdoutの応答本体の両方を取得する方法はありません。
pvandenberkの答えとSOで学んだこの他の非常に有用なトリックに基づいて、ここに回避策があります:
curl_with_error_code () {
_curl_with_error_code "$@" | sed '$d'
}
_curl_with_error_code () {
local curl_error_code http_code
exec 17>&1
http_code=$(curl --write-out '\n%{http_code}\n' "$@" | tee /dev/fd/17 | tail -n 1)
curl_error_code=$?
exec 17>&-
if [ $curl_error_code -ne 0 ]; then
return $curl_error_code
fi
if [ $http_code -ge 400 ] && [ $http_code -lt 600 ]; then
echo "HTTP $http_code" >&2
return 127
fi
}
この関数はとおりに振る舞うcurl
が、127(リターンコードで未使用戻りますcurl
範囲[400、600のHTTPコードの場合)。
これにより、リクエストがurlに送信され、レスポンスの最初の行のみが取得され、ブロックで分割され、2番目の行が選択されます。
応答コードが含まれています
curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2
POSTリクエストの場合、以下が機能しました。
curl -w 'RESP_CODE:%{response_code}' -s -X POST --data '{"asda":"asd"}' http://example.com --header "Content-Type:application/json"|grep -o 'RESP_CODE:[1-4][0-9][0-9]'
次のcURLコマンドを使用し、次のようにgrepにパイプします。
$ curl -I -s -L http://example.com/v3/get_list | grep "HTTP / 1.1"
各フラグの機能は次のとおりです。
-I
:応答ヘッダーのみを表示-s
:サイレント-進行状況バーを表示しない-L
:Location:
ヘッダーに従うHTTPステータスコードへのリンクを次に示します。
コマンドラインから実行します。このcurlはサイレントモードで実行され、リダイレクトに従ってHTTPヘッダーを取得します。grepは、HTTPステータスコードを標準出力に出力します。
curl -so -i /dev/null -w "%{http_code}" http://www.any_example.com
これにより、次の情報が返されます。
応答コードの使用方法の例。Geoliteデータベースが変更された場合(-z
)およびリダイレクトに従う場合()にのみ、これを使用してGeoliteデータベースを再ダウンロードします-L
。
url=http://example.com/file.gz
file=$(basename $url)
response=$(curl -L -s -o $file -z $file $url -w "%{http_code}")
case "$response" in
200) do_something ;;
301) do_something ;;
304) printf "Received: HTTP $response (file unchanged) ==> $url\n" ;;
404) printf "Received: HTTP $response (file not found) ==> $url\n" ;;
*) printf "Received: HTTP $response ==> $url\n" ;;
esac
OPはステータスコードを知りたい。多くの場合、ファイルをダウンロードするときにサイズの感覚も取得したいので、最初にcurlを使用してファイルのステータスコードとサイズを表示し、次に詳細なファイルを閉じて、目的の場所と名前にファイルを転送します:
curl -R -s -S -w "\nhttp: %{http_code} %{size_download}\n" -o /Users/myfiles/the_local_name.html http://archive.onweb.com/the_online_name.html
それからカールの仕上げを待つ
wait ${!}
次のコマンドを実行する前に。上記のような多くのコマンドのスクリプトで上記を使用すると、次のような素晴らしい応答が得られます。
http:200 42824
http:200 34728
http:200 35452
curlの-oの後には、ファイルのフルパス+ファイル名を続ける必要があることに注意してください。これにより、curlを使用してファイルをd / lしたときに、ファイルを適切な名前の構造で保存できます。また、-sと-Sを一緒に使用すると、出力は無音になりますが、エラーは表示されます。-Rは、ファイルのタイムスタンプをWebファイルのタイムスタンプに設定しようとすることにも注意してください。
私の答えは、元々@pvandenberkが提案したものに基づいていますが、それに加えて、単に/ dev / nullにリダイレクトするのではなく、実際にファイルをどこかに保存します。
出力コンテンツをにstdout
、HTTPステータスコードをに分割しますstderr
:
curl http://www.example.org -o >(cat >&1) -w "%{http_code}\n" 1>&2
HTTPステータスコードのみがstderrに必要な場合は、--silent
使用できます。
curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}\n" 1>&2
不要なストリームを次の場所にリダイレクトすることで、目的のストリームを選択できます/dev/null
。
$ (curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}" 1>&2) 1>/dev/null
200
$ (curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}" 1>&2) 2>/dev/null
<!doctype html>
...
2番目のリダイレクトが希望どおりに動作するには、サブシェルでcurlコマンドを実行する必要があることに注意してください。
bash
プロセス置換が必要です。
/tmp/out
/tmp/err
並列に実行する場合、ファイルが予期しない結果を引き起こす可能性があります。