curl コマンド 2015/03/31
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
みたいにすれば、指が疲れなくて済むかもね。悪用禁止。
オプション 2016/11/15
パラメータを取らない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の設定によってはコメンと扱いになってしまうので、その場合は-\#と書く。
リクエストヘッダに関するオプション 2016/11/19
-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に関するオプション 2016/10/18
--sslv2- SSLv2
--sslv3- SSLv3
--tlsv1- TLSv1.x
--tlsv1.0- TLSv1.0
--tlsv1.1- TLSv1.1
--tlsv1.2- TLSv1.2
-k- SSLのエラーを無視して処理を継続する。
HOWTO
BASIC認証のあるサイトをダウンロードするには 2013/11/26
$ curl --user user:password http://www.example.com/
この例だと、認証方式がBASIC認証以外の場合には対応できない。
認証方式がBASIC認証に限らない場合は --anyauth をつけると、自動で認証方式を選択してくれる。
BASIC認証以外にはDigest認証、NTLM認証に対応している。
$ curl --anyauth --user user:password http://www.example.com/
進捗表示をしないようにするには 2014/09/04
-s オプションを使う。
$ curl -s http://www.example.com/
curl: (3) [globbing] illegal character in range specification at pos ... のようなエラー
2016/08/31
URLに [] が含まれている場合は、オプションとして -g または --globoff を付けないといけない。
$ curl --globoff 'http://www.example.com/?p[]=foo'
curlが [] を特別視しているのを無効化するためなので、URLを ' ' で囲んで、シェルスクリプトが特別解釈をしないようにしたとしても、このオプションは必要。
curl: (35) Unknown SSL protocol error in connection to ... のようなエラー
2013/10/29
SSLのリモートホストに接続するときにホストによってはこのエラーが出ることがあるので、その場合はオプション --tlsv1 を付けるとよい。
リクエストヘッダやレスポンスヘッダを表示するには 2014/06/09
-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させるには 2013/11/12
オプションとして -X POST -d @- をつける。
例
cat foo.txt | curl http://www.example.com/ -X POST -d @-
-d はPOSTする本体を指定するオプションで、その後がデータになる。データをファイルで指定したい場合はファイル名の先頭に @ を付けて、
@foo.txt のように指定する。ファイルではなく標準入力を指定するには @- とする。
Cookieを使うには 2015/11/24
リクエスト時にクッキーをサーバに送信するには -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番台のエラーコードが返ってきた場合にエラーコードを返させるには 2016/04/06
シェルスクリプトの中に組み込む場合で404エラーの場合を異常として検知したい、という場合、終了コードで判定できるとうれしいが、デフォルトでは例えHTTPエラーでも正常終了の0が終了コードになってしまう。
400番台のHTTPエラーの場合に終了コードが0以外になるようにするには、オプション -f または --fail をつけるとよい。
例
if ! curl -f "$URL"; then
echo "HTTP Error"
fi
404や200などHTTPステータスコードだけを取得するには 2016/04/06
-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のエラーを無視するには 2014/09/04
SSL証明書に書いてあるホスト名と実際のアクセスしているホスト名が違っていたりして、
SSLのエラーが発生してしまう場合は、オプション -k を付けて、エラーを無視させれば良い。
例
$ curl -k 'http://192.168...../'
httpsのくせにipアドレスでアクセスさせる社内のシステムとか、これでエラーをスキップできる。
User-Agent を詐称してHTTPアクセスするには 2015/05/14
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アクセスするには 2015/06/12
-e オプションでリファラーを指定する。
## Yahooから www.example.com にジャンプしたことにする
$ curl -e http://www.yahoo.co.jp/ http://www.example.com/
リクエストヘッダのHostを詐称してHTTPアクセスするには 2017/06/03
リクエストヘッダを指定する -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 オプションを使うのもあり。
外部リンク 2016/08/29
- curl vs Wget
https://daniel.haxx.se/docs/curl-vs-wget.html
日本語訳 http://postd.cc/curl-vs-wget/