改めて curl の使い方まとめ
この記事は書かれてから1年以上が経過しており、最新の情報とは異なる可能性があります
20162017 年にもなって curl の使い方をまとめるのもどうかという声もあるかもしれませんが、
実際 20162017 年になっても よく使うコマンド なので、
改めてよく使うオプションなどをまとめておきたいと思います。自分用です。
ちなみに wget に関しては、クローリング機能があるのを過去に知らなかったので、 そちらに関しては以下にまとめたことがあります。
wgetが超絶便利なwebクローラー、クローリングツールだとは知らなかった・・・!
curl の基本的な使い方
wget はダウンロードが中心の使い方なのに対して、
curl はケースごとにリクエストを投げる、といった使い方に向いてそうな気がします。
アクセスできたかどうかの確認だけならば、
わざわざブラウザを開かずとも黒い画面から curl
コマンドだけで確認が可能です。
ちなみにここからは以下のバージョンでの話になります。Mac です。
curl 7.43.0 (x86_64-apple-darwin15.0) libcurl/7.43.0 SecureTransport zlib/1.2.5
man curl をみると、
NAME
curl - transfer a URL
SYNOPSIS
curl [options] [URL...]
もろもろオプションはあるものの、普通に使うだけならば以下のようにシンプルに使えます。
curl http://girigiribauer.com
-0 をつけないといけないみたいな紹介もあったりしますが、過去はそうだったんですかね? 出力は得られた HTML ファイルがそのまま標準出力に表示されます。 JSON ファイルの場合は、そのままパイプにつなげて jq コマンドあたりで整形やフィルタリングなどを しても便利かもしれません。
ちなみに、プロトコルのバージョン指定のオプションは以下のようなものが用意されています。 なにもつけなければ以下にあるように –http1.1 をつけたのと同じになります。(バージョン 7.33 から?) 最近の HTTP/2 も追加されているようですね。
-0, --http1.0
(HTTP) Tells curl to use HTTP version 1.0 instead of using its internally
preferred: HTTP 1.1.
--http1.1
(HTTP) Tells curl to use HTTP version 1.1. This is the internal default
version. (Added in 7.33.0)
--http2
(HTTP) Tells curl to issue its requests using HTTP 2. This requires that
the underlying libcurl was built to support it. (Added in 7.33.0)
また、何もつけなければ GET リクエストになりますが、本当にアクセスしたいだけなら
--head
オプションをつけることで HEAD リクエストにもなります。
本文は送られてこないので、出力はレスポンスヘッダそのままです。
% curl --head example.com
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: max-age=604800
Content-Type: text/html
Date: Wed, 14 Sep 2016 14:55:05 GMT
Etag: "359670651"
Expires: Wed, 21 Sep 2016 14:55:05 GMT
Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
Server: ECS (pae/3796)
X-Cache: HIT
x-ec-custom-error: 1
Content-Length: 1270
このあたりを最低限知っておくだけでも、 HTTP で GET リクエストの確認をしたいだけの場合に わざわざブラウザを開かずに済むと思います。
あと、 -v
オプション(–verbose)をつけることでも
リクエストヘッダ&レスポンスヘッダを確認することができます。
% curl --head -v example.com
* Rebuilt URL to: example.com/
* Trying 93.184.216.34...
* Connected to example.com (93.184.216.34) port 80 (#0)
> HEAD / HTTP/1.1
> Host: example.com
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Accept-Ranges: bytes
Accept-Ranges: bytes
< Cache-Control: max-age=604800
Cache-Control: max-age=604800
< Content-Type: text/html
Content-Type: text/html
< Date: Thu, 15 Sep 2016 09:10:38 GMT
Date: Thu, 15 Sep 2016 09:10:38 GMT
< Etag: "359670651"
Etag: "359670651"
< Expires: Thu, 22 Sep 2016 09:10:38 GMT
Expires: Thu, 22 Sep 2016 09:10:38 GMT
< Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
< Server: ECS (pae/3796)
Server: ECS (pae/3796)
< X-Cache: HIT
X-Cache: HIT
< x-ec-custom-error: 1
x-ec-custom-error: 1
< Content-Length: 1270
Content-Length: 1270
<
* Connection #0 to host example.com left intact
頭に > がついている方がリクエスト、 頭に < がついている方がレスポンスですね。
このあたり+ man curl
を覚えておけば、
最低限調べながら使えると思います。
curl 用途別の使い方
よく使うものをケースごとにまとめておきます。
basic 認証内のページにアクセスする
--basic
オプションと --user
オプションをつければ OK なのですが、
--user
オプションだけでもいけちゃったりします。
curl -u username:password example.com
man ページ内の関連部分を抜粋しておきます。
--basic
(HTTP) Tells curl to use HTTP Basic authentication with the remote host.
This is the default and this option is usually pointless, unless you use it
to override a previously set option that sets a different authentication
method (such as --ntlm, --digest, or --negotiate).
Used together with -u, --user and -x, --proxy.
(中略)
-u, --user <user:password>
Specify the user name and password to use for server authentication. Over-
rides -n, --netrc and --netrc-optional.
フォームから POST する
結構簡単です。
curl -F "id=foobar" example.com
POST の場合、-x
オプション(--request
)のあとに POST と指定することもできますが、
試してみたところ -F
オプション(--form
)をつけるだけで POST になるようですね。
JSON を POST する
上記と少し異なり、 -H
オプションでヘッダの Content-type を json に変えつつ、
実際にポストするデータを -d
オプションで送ってやれば OK です。
curl -H "Content-type: application/json" -d '{"id": "foobar"}' example.com
-d
オプション(--data
)で指定しているところは、実際の JSON データが入るので、
もちろん JSON valid である必要があります。JSON はダブルクオテーションです。
まとめ
普通に使う分には、
- 通常の GET
- フォーム経由の POST
- JSON 経由の POST
- basic 認証などでも使えるヘッダー付きアクセス
あたりを知っておけば必要十分ですし、それ以上必要なときは curl --help
を引けば OK だと思います。
また、戻り値が JSON であった場合は、 jq
コマンドにパイプで繋げてやればスムーズに確認が可能です。
curl -H "Content-type: application/json" -d '{"id": "foobar"}' example.com | jq "."
そういえば前に jq について少し書いてました。
vagrant global-status の代替方法、あるいは jq コマンドの使い方
ちなみにこちらの curl の記事、本当は2016年に書いてあって放置してあって、 curl 使うたびにこの下書きをちらちら見てたりもしたので、実際これくらいが必要十分だと思います。
参考URL
この記事は書かれてから1年以上が経過しており、最新の情報とは異なる可能性があります