curlで個人的によく使うコマンド(オプション)のまとめ【HTTPリクエスト】

curlはHTTPリクエストを試すのによく使うコマンドです。ここでは個人的によく使うcurlコマンドやオプション一覧、忘れがちなcurlの便利な使い方などをまとめています。

※ 本ページはプロモーションが含まれています。

本記事の目的と環境

最終更新日:2023/10/3

本ページでは、curlコマンドでWebページにHTTPリクエストする時の、HTTPリクエストヘッダー(Request Header)、HTTPレスポンスヘッダー(Response Header)、その他個人的によく使うcurlコマンドのオプション(option)一覧について説明しています。

curlはウェブ関連(WebページやWeb API)のHTTPリクエストを試したい時によく使う手軽で便利なコマンドです。WebページのHTML本体を取得するだけでなく、HTTPリクエストヘッダーを指定したり、HTTPレスポンスヘッダーを確認したい場合、HTTP POSTリクエストをコマンドラインで実行したい場合などで使えます(他にも用途はいっぱいある。)

ITネットワークの基礎を学習している初心者、入門者が、コマンド操作でcurlを使いこなしていると、ちょっとスマートに見えたりもします。curlコマンド、HTTPリクエストを試している人、学習している人は、是非参考にして下さい。

■このOS環境のcurlで試しています。
macOS Big Sur(バージョン11.7.10)

$ curl -V
curl 8.1.2 (x86_64-apple-darwin20.0) libcurl/8.1.2 (SecureTransport) LibreSSL/2.8.3 zlib/1.2.11 nghttp2/1.41.0
Release-Date: 2023-05-30
AWS ec2のAmazon Linux release 2 (Karoo)
$ curl -V
curl 7.61.1 (x86_64-koji-linux-gnu) libcurl/7.61.1 OpenSSL/1.0.2k zlib/1.2.7 libidn2/2.3.0 libssh2/1.4.3 nghttp2/1.41.0
CentOS Linux 7.9
$ curl -V
curl 7.61.1 (x86_64-pc-linux-gnu) libcurl/7.61.1 OpenSSL/1.0.2k zlib/1.2.7

curlでhttps(ssl)アクセス時のSSLエラー。-kオプション

curlでSSLのサイト(https://〜)にアクセスする時、macOS環境のcurl(ターミナル)は問題なく実行できましたが、CentOSのcurlだとエラーが発生しました。

$ curl https://○○○○.com/
curl: (60) SSL certificate problem: certificate has expired
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
これはSSL証明書エラーで、-kオプションで証明書エラーをスキップして実行する事ができて結果を取得する事ができます。
$ curl -k https://○○○○.com/
<html  lang="ja" >
〜

という事で、これ以降のcurlコマンド例を試してSSLエラーが出る場合は-kオプションを併用してください。

curlのヘルプやマニュアルで、curlの使い方やオプション一覧を見る。 -Mオプション(--manual)、manコマンド

curlコマンドのヘルプやマニュアルを見て、curlの使い方やオプション一覧を確認したい場合、curlコマンドなら-M(--manual)オプションでマニュアルが見れます。

$ curl -M
もしくはmanコマンドで見る。
$ man curl

curlでHTTPヘッダ(HTTP header)を表示する。-Iオプション、-iオプション

HTTPリクエストで、HTTPヘッダー(レスポンスヘッダ・一般ヘッダ・エンティティヘッダ)の情報を見たい時は、-Iオプションを使います。

$ curl -I https://○○○○.com/
HTTP/1.1 200 OK
Date: Tue, 21 Jun 2022 20:54:07 GMT
Server: Apache/2.2.15 (CentOS)
X-Powered-By: PHP/7.3.20
Expires: Thu, 23 Nov 1981 07:35:00 GMT
Link: < https://○○○○.com/wp-json/>; rel="https://api.w.org/"
Content-Type: text/html; charset=UTF-8
curlの-IオプションでHTTPヘッダーを取得すると、Webサーバの情報(Apache・Nginx)や、PHPのバージョン(PHPを使用しているなら)などのHTTPヘッダの情報を知る事ができます。
(*アクセスするWebサイト(Webサーバ)によって、返してくるHTTPレスポンスヘッダ情報は異なります。)

Webサイトによっては、HTTPのバージョン2(HTTP/2)に対応している事がわかる。

$ curl -I https://○○○○2.com/
HTTP/2 200 
content-type: text/html; charset=UTF-8
server: nginx
date: Tue, 03 Oct 2023 04:49:47 GMT
x-cached: Tue, 03 Oct 2023 04:49:41 GMT
x-cache-status: HIT
vary: Accept-Encoding
〜
curlを使えば、HTTPのバージョン1.1(HTTP/1.1)か2(HTTP/2)の判別をすぐにできるという事です。

HTTPヘッダーと本体(HTML)の両方の情報を同時に取得したい場合、-iオプションを使います。

$ curl -i https://○○○○.com/
HTTP/1.1 200 OK
Date: Tue, 21 Jun 2022 21:26:53 GMT
Server: Apache/2.2.15 (CentOS)
〜
<!DOCTYPE html >
<html lang="ja" >
〜

HTTPリクエストヘッダも見たいなら、-vオプション(冗長モード)、-sオプション(サイレントモード)

curlコマンドでレスポンス系のHTTPヘッダーだけでなく、HTTPリクエストヘッダー(Requqest Header)も表示して見たい時は、-v(--verbose)オプションで確認できます。

curlの-vはverbose(冗長)オプションなので、HTTPリクエストのやりとり(HTTPリクエストの詳細な情報(HTTPリクエストヘッダやレスポンスヘッダ))を出力して確認する事ができるので、Webサイトが取得できない時や、HTTP通信ができない時の原因究明のデバッグで使えたりします。

$ curl -v https://○○○○.com/
*   Trying ***.***.***.***...
* TCP_NODELAY set
* Connected to ○○○○.com (***.***.***.***) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/cert.pem
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
〜
*  SSL certificate verify ok.
> GET / HTTP/1.1
> Host: ○○○○.com
> User-Agent: curl/7.64.1
> Accept: */*
> 
< HTTP/1.1 200 OK
< Date: Tue, 21 Jun 2022 22:34:21 GMT
< Server: Apache/2.2.15 (CentOS)
< X-Powered-By: PHP/7.3.20
〜
-vオプションで、HTTPリクエストヘッダのGETメソッドリクエストやUser-Agentが確認できます。
また、リクエストヘッダの情報だけでなく、その他のHTTPヘッダーやSSL通信の情報も確認できますね。

-v(--verbose)の反対で、-s(--silent)オプションもあります。-sはサイレントモードです。curlで取得した結果を文字列処理するためにパイプで別のコマンドに渡す場合、通信時間の進捗データやエラーメッセージが出力される事がありますが、これらの出力表示が不必要で非表示にしたい場合に-sオプションを使います。

■-sオプション無しでcurlの実行結果をgrepで処理する場合

$ curl https://○○○○.com/ | grep text/javascript
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0<script type="text/javascript">
〜
■-sオプション有りでcurlの実行結果をgrepで処理する場合
$ curl -s https://○○○○.com/ | grep text/javascript
<script type="text/javascript">
〜

(広告)アマゾンでITネットワーク初心者向けの入門書やKindleを探す!

ChromeブラウザでHTTPリクエストヘッダとレスポンスヘッダを出力・確認する

curlコマンドではなくWebブラウザの話ですが、WebブラウザのChromeでもデベロッパーツール(Developer Tools)を使えば、HTTPリクエストヘッダ(Request Header)やレスポンスヘッダ(Response Header)の情報を表示して確認する事ができます。

デベロッパーツールを起動するには、ブラウザ画面を右クリック->"検証"でできます(ショートカット起動は、macなら「Command+Option+I」、Windwosなら「Ctrl+Shift+J 」または F12)。

デベロッパーツールの使用例や、HTTPリクエストヘッダーとHTTPレスポンスヘッダーの確認方法は別ページで説明してるので、そちらを参考にしてください。
Chromeデベロッパーツールを使って、HTTPリクエストヘッダーやHTTPレスポンスヘッダーの情報を確認する

curlでHTTPリクエストヘッダを指定してHTTPリクエストをする。-Hオプション(--header)

curlコマンドのHTTPリクエストでリクエストヘッダを指定したい時は、-Hオプション(--header)を使います。(--headerの方がパッと見でわかりやすいから良いかも。)

試しに、-HオプションでUser-Agent(UserAgent、ユーザーエージェント)と適当な(存在しない)Hoge-Headerの2つをHTTPリクエストヘッダーに指定して、curlでHTTPリクエストしてみます。あと、HTTPリクエストヘッダーを確認するために冗長モード(-vオプション)で実行します。

$ curl -v https://○○○○.com/ \
> -H 'Hoge-Header: hogeheadervalue' \
> -H 'User-Agent: hogehogeAgent' 
〜
> GET / HTTP/1.1
> Host:○○○○.com
> Accept: */*
> Hoge-Header: hogeheadervalue
> User-Agent: hogehogeAgent
〜

curlでリクエストヘッダー(Request header)を複数同時に指定する場合、-Hオプションは1つずつ指定してもいいし、1つだけでもどちらでもいいです。

$ curl -v https://○○○○.com/ \
> -H 'Hoge-Header: hogeheadervalue' 'User-Agent: hogehogeAgent'
〜

curlの実行結果でHTTPリクエストヘッダーを確認すると、User-Agentの値が変更されているのと、適当なHoge-Headerというヘッダーが追加されている事が確認できます。

ですので例えば、HTTPリクエストヘッダーでIf-Modified-SinceやIf-None-Matchを指定して条件付きHTTPリクエストをWebサイト(ウェブサーバ)にしたい時は、-Hオプションを指定すればできます。(curlでIf-Modified-Sinceを指定してHTTPリクエストを実行すれば、Webページに更新があった場合だけ取得するという事ができる(Webサイト側が対応している場合に限るが。))

If-Modified-SinceやIf-None-Matchを使う条件付きHTTPリクエストについては別ページで詳しく書いていますので、そちらを参考にしてみてください。
Webページの最新更新日時の情報を取得する

-Hオプションでユーザーエージェント(User-Agent、UA)の指定についての話です。Webサイトの中にはブラウザでは問題なく見れるけど右クリックできなくてHTMLソースを見れないし、また、curlを実行しても"403 Forbidden"エラーを返してHTMLソースを取得できないWebサイトがあります。

$ curl -I https://○○○○.com/
HTTP/1.1 403 Forbidden
〜
そういうWebサイトは、ユーザーエージェントでHTTPリクエストを受け付けるかどうかを判断している場合もあるので(curlなら受け付けないとか)、curlでもユーザーエージェントを適当に指定すれば問題なく実行できてHTMLソースが取得できる場合もあります。
$ curl -I https://○○○○.com/ -H 'User-Agent: hoge' 
HTTP/1.1 200 OK
〜
ただ、Webサイト運営者も意図があってリクエストを受け付けないようにしていると思うので、悪用はしないように!

(広告)アマゾンでITネットワーク関連の本を探す!

curlでHTTPリクエストして取得したHTMLをファイル保存する。-oオプション(--outputオプション)。wgetコマンドでWebページをファイル保存する場合についても。

curlでHTTPリクエストして取得したHTMLをファイルに出力したい時は、-oオプション、もしくは、--outputオプションを使います。出力するファイル名は、-oオプションのすぐ後に指定する必要があります(ファイル名の指定は必須で、指定しないとエラーが出てできないです)。

$ curl https://○○○○.com/ -o hoge.html
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 89323    0 89323    0     0   431k      0 --:--:-- --:--:-- --:--:--  431k

$ ls -lht
total 173800
-rw-r--r--   1 hogeuser  staff   108K 10  3 15:25 hoge.html
〜

ネット上のWebページを取得してファイル保存したい場合、curlよりwgetコマンドの方がよく使うかもです。

$ wget https://○○○○.com/
~
https://○○○○.com/ (https://○○○○.com/)|***.***.***.***|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 特定できません [text/html]
`index.html' に保存中
~
wgetで保存するファイル名を指定する場合は-Oオプションを使います。
$ wget https://○○○○.com/ -O hoge.html
~
https://○○○○.com/ (https://○○○○.com/)|***.***.***.***|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 特定できません [text/html]
`hoge.html' に保存中
~

curlでHTTPのPOSTリクエストを実行してサーバにデータ送信する。-Xオプション、-dオプション(--dataオプション)、--data-urlencodeオプション

HTTPリクエストには、GET・POST・HEAD・PUT・OPTIONなどのHTTPリクエストのメソッドがあります。

curlでメソッドを指定しない場合はGETメソッドでのHTTPリクエストになりますが、HTTPリクエストのメソッドを指定したい時は、-Xオプションを使います。

そして、POSTメソッドでWebサーバにデータ送信したい場合、送信するデータを指定をするには-dオプション、もしくは、--dataオプションを使います。(POSTのHTTPリクエストは、Webページのよく見かける入力フォームでデータをサーバ送信する時に使われます。)

$ curl -X POST https://○○○○.com/ -d 'id=5'
$ curl -X POST https://○○○○.com/ --data 'id=5'

また、POSTメソッドで複数データを送信したい場合、-dオプション(--dataオプション)を複数使用するか、複数データを&で繋ぎます。

$ curl -X POST https://○○○○.com/ -d 'id=5' -d 'code=key1'
$ curl -X POST https://○○○○.com/ -d 'id=5&code=key1'

また、日本語データをURLエンコードして送信したい時は、--data-urlencodeオプションを使います。

$ curl -X POST https://○○○○.com/ --data 'id=5&code=key1' --data-urlencode 'color=黄色'

これだけでも覚えておくと、WebページのHTMLフォーム(formやinputタグ)などでPOSTリクエストでサーバにデータ送信したい時に、curlコマンドで簡単に色々と試す事ができて便利です。

Webサイト(HTML)ではなくjsonデータを返してくる場合、curlの取得結果をjqコマンドに渡してjsonデータを処理する

curlでHTTPリクエストをするとWebサイト(HTML)ではなくjsonデータを返してくるパターンがあります。(WebサイトではなくWeb APIのレスポンスはjsonが多い)。

サーバがレスポンス本体をjsonデータで返してくる場合、そのレスポンス結果をパイプ(|)でjqコマンドに渡せばデータ処理をするのに便利です。jqコマンドはjsonデータを整形・加工するのに便利なコマンドです。

curlとjqを組み合わせた使用例は別ページで少し書いていますので、そちらを参考にしてください。
自分のグローバルIPアドレス・プライベートIPアドレスを確認するコマンド色々