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
curl
コマンドを異常終了する。このオプションを指定しないと、400番台でもcurl
コマンドの終了コードは0になる。--head
-I
と同じ。-I
--head
と同じ。-o
ファイル名-s
-S
を併用しないとエラーメッセージまで表示しなくなっちゃう。-S
-s
を使うとエラーメッセージも表示しなくなってしまうが、-s
と-S
を併用すると、エラーメッセージは表示する。エラーメッセージは例えばホスト名がまちがっていたときのcurl: (6) Could not resolve host
だとかである。-v
-#
-s
をつけちゃうと意味がない。#
はシェルスクリプト中やzshの設定によってはコメンと扱いになってしまうので、その場合は-\#
と書く。-A
-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-H
-H "Content-Type: application/json"
という指定をする--sslv2
--sslv3
--tlsv1
--tlsv1.0
--tlsv1.1
--tlsv1.2
-k
$ curl --user user:password http://www.example.com/
この例だと、認証方式がBASIC認証以外の場合には対応できない。
認証方式がBASIC認証に限らない場合は--anyauth
をつけると、自動で認証方式を選択してくれる。BASIC認証以外にはDigest認証、NTLM認証に対応している。
$ curl --anyauth --user user:password http://www.example.com/
-s
オプションを使う。
$ curl -s http://www.example.com/
curl: (3) [globbing] illegal character in range specification at pos ...
のようなエラー2016/08/31URLに[]
が含まれている場合は、オプションとして-g
または--globoff
を付けないといけない。
$ curl --globoff 'http://www.example.com/?p[]=foo'
curlが[]
を特別視しているのを無効化するためなので、URLを' '
で囲んで、シェルスクリプトが特別解釈をしないようにしたとしても、このオプションは必要。
curl: (35) Unknown SSL protocol error in connection to ...
のようなエラー2013/10/29SSLのリモートホストに接続するときにホストによってはこのエラーが出ることがあるので、その場合はオプション--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とは違いレスポンス本体がないかもしれない。
オプションとして-X POST -d @-
をつける。
例
cat foo.txt | curl http://www.example.com/ -X POST -d @-
-d
はPOSTする本体を指定するオプションで、その後がデータになる。データをファイルで指定したい場合はファイル名の先頭に@
を付けて、@foo.txt
のように指定する。ファイルではなく標準入力を指定するには@-
とする。
リクエスト時にクッキーをサーバに送信するには-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エラーの場合を異常として検知したい、という場合、終了コードで判定できるとうれしいが、デフォルトでは例えHTTPエラーでも正常終了の0が終了コードになってしまう。
400番台のHTTPエラーの場合に終了コードが0以外になるようにするには、オプション-f
または--fail
をつけるとよい。
例
if ! curl -f "$URL"; then echo "HTTP Error"fi
-w '%{http_code}\n'
というオプションを付けるとHTTPステータスコードを表示させられる。
$ curl -Ss -w '%{http_code}\n' 'http://www.yahoo.co.jp/' -o /dev/null200$ curl -Ss -w '%{http_code}\n' 'http://www.yahoo.co.jp/a' -o /dev/null404$ curl -Ss -w '%{http_code}\n' 'http://notfound.example.com/' -o /dev/null000
-Ss
はいろいろだまらせるためのオプション。-o /dev/null
はレスポンスボディを捨てるオプション。> /dev/null
とすると、HTTPステータスコードの表示も/dev/null
にリダイレクトされてしまう。
最後の000
の例はリクエストすらできていないので実際にレスポンスされたHTTPステータスコードではない。
SSL証明書に書いてあるホスト名と実際のアクセスしているホスト名が違っていたりして、SSLのエラーが発生してしまう場合は、オプション-k
を付けて、エラーを無視させれば良い。
例
$ curl -k 'http://192.168...../'
httpsのくせにipアドレスでアクセスさせる社内のシステムとか、これでエラーをスキップできる。
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.2curl/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/
-e
オプションでリファラーを指定する。
## Yahooから www.example.com にジャンプしたことにする$ curl -e http://www.yahoo.co.jp/ http://www.example.com/
リクエストヘッダを指定する-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
オプションを使うのもあり。