curl コマンド

HTTPアクセスをしてコンテンツを取得できるコマンド。 wgetでも同じようなことができる。 FTPやSCPとかでもファイル転送できるらしいが、自分はHTTPやHTTPSで使うことがほとんど。

URLをパラメータにしてそのコンテンツを標準出力させるのが、基本的な使い方。

$ curl http://www.example.com/

ファイルに保存したければ、リダイレクトを使えばよい。 -o オプションでもファイル保存ができるらしいが、そんなオプションを記憶しておくよりもどのコマンドでも使えるシェルのリダイレクトの方法を覚えておけば、ほとんどの場合に使えるから、自分はそうしている。

$ curl http://www.example.com/ > example.html

F5アタックなんかしたいときは

$ while :; do curl -s 'http://www.example.com/' >/dev/null; done
## またはwgetの場合
$ while :; do wget -q -O- 'http://www.example.com/' >/dev/null; done

みたいにすれば、指が疲れなくて済むかもね。悪用禁止。

スポンサーリンク

オプション

パラメータを取らない1文字(ハイフン含めれば2文字)のオプションは、つなげることができる。つまり -S -s -f-Ssf と書ける。

-f または --fail
HTTPで400番台のレスポンスコードが返ってきたときにcurlコマンドを異常終了する。このオプションを指定しないと、 400番台でもcurlコマンドの終了コードは0になる。
--head
HTTPリクエスト時にHEADメソッドを使い、レスポンスヘッダのみを取得する。 -I と同じ。
-I
HTTPリクエスト時にHEADメソッドを使い、レスポンスヘッダのみを取得する。 --head と同じ。
-o ファイル名
取得結果をファイルに保存する。このオプションを指定しないと、標準出力に吐き出される。
-s
ダウンロードの進捗とエラーメッセージを表示しない。このオプションを指定しないと、標準エラー出力に進捗を表示する。-S を併用しないとエラーメッセージまで表示しなくなっちゃう。
-S
-s を使うとエラーメッセージも表示しなくなってしまうが、-s-S を併用すると、エラーメッセージは表示する。 エラーメッセージは例えばホスト名がまちがっていたときの curl: (6) Could not resolve host だとかである。
-v
リクエストヘッダとレスポンスヘッダを標準エラー出力に表示する。
-#
プログレスバーを表示。-s をつけちゃうと意味がない。# はシェルスクリプト中やzshの設定によってはコメンと扱いになってしまうので、その場合は -\# と書く。

リクエストヘッダに関するオプション

-A
HTTPリクエストヘッダの User-Agent を指定する。例: -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.50 Safari/537.36"
-e リファラURL
HTTPリクエストヘッダにリファラを付ける。
-H
リクエストヘッダを追加する。POSTのフォーマットがJSONの場合は -H "Content-Type: application/json" という指定をする

SSLに関するオプション

--sslv2
SSLv2
--sslv3
SSLv3
--tlsv1
TLSv1.x
--tlsv1.0
TLSv1.0
--tlsv1.1
TLSv1.1
--tlsv1.2
TLSv1.2
-k
SSLのエラーを無視して処理を継続する。

HOWTO

BASIC認証のあるサイトをダウンロードするには

$ curl --user user:password http://www.example.com/

この例だと、認証方式がBASIC認証以外の場合には対応できない。

認証方式がBASIC認証に限らない場合は --anyauth をつけると、自動で認証方式を選択してくれる。 BASIC認証以外にはDigest認証、NTLM認証に対応している。

$ curl --anyauth --user user:password http://www.example.com/

-> wgetコマンドでのBASIC認証

進捗表示をしないようにするには

-s オプションを使う。

$ curl -s http://www.example.com/

curl: (3) [globbing] illegal character in range specification at pos ... のようなエラー

URLに [] が含まれている場合は、オプションとして -g または --globoff を付けないといけない。

$ curl --globoff 'http://www.example.com/?p[]=foo'

curlが [] を特別視しているのを無効化するためなので、URLを ' ' で囲んで、シェルスクリプトが特別解釈をしないようにしたとしても、このオプションは必要。

curl: (35) Unknown SSL protocol error in connection to ... のようなエラー

SSLのリモートホストに接続するときにホストによってはこのエラーが出ることがあるので、その場合はオプション --tlsv1 を付けるとよい。

リクエストヘッダやレスポンスヘッダを表示するには

-v を付けると、リクエストヘッダは > で表示され、レスポンスヘッダは < で表示される。どちらも標準エラー出力で表示される。

$ curl -v http://www.example.com/

出力例

> GET /foo/ HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: www.example.com
> Accept: */*
>
< HTTP/1.1 302 Found
< Date: Wed, 16 Oct 2013 04:34:42 GMT
< Server: Apache
< Vary: Accept-Encoding
< Content-Length: 100
< Connection: close
< Content-Type: text/html; charset=UTF-8

リクエストヘッダが不要で単にレスポンスヘッダだけを見たい場合は -I でもいいかもしれない。 -I は実際には、HTTPのHEADコマンドが発行されている。その様子は -Iv とすればわかる。 HEADコマンドなので、GETとは違いレスポンス本体がないかもしれない。

POSTする本体を標準入力から取り込ませてそのままWebサーバにPOSTさせるには

オプションとして -X POST -d @- をつける。

cat foo.txt | curl  http://www.example.com/ -X POST -d @-

-d はPOSTする本体を指定するオプションで、その後がデータになる。データをファイルで指定したい場合はファイル名の先頭に @ を付けて、 @foo.txt のように指定する。ファイルではなく標準入力を指定するには @- とする。

Cookieを使うには

リクエスト時にクッキーをサーバに送信するには -b オプションを使う。受信したクッキーを保存するには -c オプションを使う。

## サーバにクッキーを送信
$ curl -b cookie.txt http://www.example.com/

## サーバから受信したクッキーを保存
$ curl -c cookie.txt http://www.example.com/

## サーバにクッキーを送信し、受信したクッキーを再び保存
$ curl -b cookie.txt -c cookie.txt http://www.example.com/

クッキーファイルは以下のようなタブ区切りのフォーマットのテキストファイルである。

.example.com TRUE / FALSE 1450279467 name1 value1
.example.com TRUE / FALSE 1450279467 nam2e value2

Google Chrome に保存されているクッキーをこのフォーマットに書き出すには、私は cookie.txt export という拡張を使っている。

404などの400番台のエラーコードが返ってきた場合にエラーコードを返させるには

シェルスクリプトの中に組み込む場合で404エラーの場合を異常として検知したい、という場合、終了コードで判定できるとうれしいが、デフォルトでは例えHTTPエラーでも正常終了の0が終了コードになってしまう。

400番台のHTTPエラーの場合に終了コードが0以外になるようにするには、オプション -f または --fail をつけるとよい。

if ! curl -f "$URL"; then
    echo "HTTP Error"
fi

404や200などHTTPステータスコードだけを取得するには

-w '%{http_code}\n' というオプションを付けるとHTTPステータスコードを表示させられる。

$ curl -Ss -w '%{http_code}\n' 'http://www.yahoo.co.jp/' -o /dev/null
200
$ curl -Ss -w '%{http_code}\n' 'http://www.yahoo.co.jp/a' -o /dev/null
404
$ curl -Ss -w '%{http_code}\n' 'http://notfound.example.com/' -o /dev/null
000

-Ss はいろいろだまらせるためのオプション。 -o /dev/null はレスポンスボディを捨てるオプション。 > /dev/null とすると、HTTPステータスコードの表示も /dev/null にリダイレクトされてしまう。

最後の 000 の例はリクエストすらできていないので実際にレスポンスされたHTTPステータスコードではない。

SSLのエラーを無視するには

SSL証明書に書いてあるホスト名と実際のアクセスしているホスト名が違っていたりして、 SSLのエラーが発生してしまう場合は、オプション -k を付けて、エラーを無視させれば良い。

$ curl -k 'http://192.168...../'

httpsのくせにipアドレスでアクセスさせる社内のシステムとか、これでエラーをスキップできる。

User-Agent を詐称してHTTPアクセスするには

curlはデフォルトでは以下のようなUser-Agentを名乗る。これはいくつかの手元の環境で確認したもの。

curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.13.6.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3

curlに-Aオプションを使うと、User-Agentを指定することができる。

$ curl -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.50 Safari/537.36" http://www.example.com/

リファラーを付けてHTTPアクセスするには

-e オプションでリファラーを指定する。

## Yahooから www.example.com にジャンプしたことにする
$ curl -e http://www.yahoo.co.jp/ http://www.example.com/

リクエストヘッダのHostを詐称してHTTPアクセスするには

リクエストヘッダを指定する -H オプションを使ってHostを指定する。

$ curl -H Host:www.example.co.jp http://test.example.com/

この例だと、test.example.com をDNSで引いてリクエスト先のサーバを決定するが、そのサーバに対して Host:www.example.co.jp を付けてリクエストする。

将来 www.example.co.jp として運用する予定でその名前でApacheのVirtualHostを設定してあるが、まだDNSでは www.example.co.jp という名前は別のサーバに向いている場合に、 VirtualHostの設定の動作確認をしたりするのに使える。

なぜかDNS引くのが遅い場合にも、URLをIPにして -H オプションを使うのもあり。

外部リンク

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。
スポンサーリンク