curlはHTTPリクエストを試すのによく使うコマンドです。ここでは個人的によく使うcurlコマンドやオプション一覧、忘れがちなcurlの便利な使い方などをまとめています。
※ 本ページはプロモーションが含まれています。
このページでは、curlコマンドでHTTPリクエストする時の、HTTPリクエストヘッダー、HTTPレスポンスヘッダー、その他個人的によく使うcurlオプション(option)について説明しています。curlはウェブ関連のHTTPリクエストを試したい時によく使う手軽で便利なコマンドなので、よければ参考にしてください。
■このOS環境のcurlで試しています。
macOS Big Sur(バージョン11.6.6)
$ curl -V
curl 7.64.1 (x86_64-apple-darwin20.0) libcurl/7.64.1 (SecureTransport) LibreSSL/2.8.3 zlib/1.2.11 nghttp2/1.41.0
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で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オプションを併用してください。
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
ここでは、Webサーバの情報(Apache・Nginx)や、PHPのバージョン(PHPを使用しているなら)などのHTTPヘッダの情報を知る事ができます。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" >
〜
curlコマンドでレスポンス系のHTTPヘッダーだけでなく、HTTPリクエストヘッダー(Requqest Header)も表示して見たい時は、-v(--verbose)オプションで確認できます。
-vはverbose(冗長)オプションで、HTTPリクエスト操作中の詳細な(HTTPリクエストヘッダ・レスポンスヘッダ)情報を表示して確認する事ができるので、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
〜
リクエストヘッダのGETメソッドやUser-Agentが確認できますし、また、リクエストヘッダの情報だけでなく、その他のHTTPヘッダーやSSL通信の情報も確認できますね。
-v(--verbose)の反対で、-s(--silent)オプションもあります。-sはサイレントモードです。curlで取得した結果を文字列処理するためにパイプで別のコマンドに渡す場合、通信時間の進捗データやエラーメッセージが出力される事がありますが、これらの出力表示が不必要で非表示にしたい場合に-sオプションを使います。
curlコマンド外の話ですが、ウェブブラウザのChromeでもデベロッパーツール(Developer Tools)を使えば、HTTPリクエストヘッダ(Request Header)やレスポンスヘッダ(Response Header)の情報を表示して確認する事ができます。
デベロッパーツールを起動するには、ブラウザ画面を右クリック->"検証"でできます(ショットカットでの起動は、macなら「Command+Option+I」、Windwosなら「Ctrl+Shift+J 」または F12)。
デベロッパーツールの簡単な使用例については別ページで書いていますので、そちらを参考にしてください。
Chromeデベロッパーツールを使って、HTTPリクエストヘッダーやHTTPレスポンスヘッダーの情報を確認する
curlコマンドのHTTPリクエストでリクエストヘッダを指定したい時は、-Hオプションを使います。
$ 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
〜
-vでリクエストヘッダーを確認すると、User-Agentの値が変更されているのと、新しい適当なHoge-Headerというヘッダーが追加されているのがわかります。
ですので、例えばリクエストヘッダーでIf-Modified-SinceやIf-None-Matchを指定して条件付きHTTPリクエストをWebサイト(ウェブサーバ)にしたい時は、-Hオプションを指定すればできます。
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サイト運営者も意図があってリクエストを受け付けないようにしていると思うので、悪用はしないように!
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
ネット上のファイルを取得して保存したい場合、wgetコマンドの方がよく使うかもしれませんね。
HTTPリクエストには、GET・POST・HEAD・PUT・OPTIONなどのメソッドがあります。
curlでメソッドを指定しない場合はGETメソッドになりますが、メソッドを指定したい時は、-Xオプションを使います。
そして、POSTメソッドでWebサーバにデータ送信したい場合、送信するデータを指定をするには-dオプション、もしくは、--dataオプションを使います。
$ 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コマンドで簡単に色々と試す事ができて便利です。
curlでHTTPリクエストをするとWebサイト(HTML)ではなくjsonデータを返してくるパターンがありますが(Web APIのレスポンスはjsonが多い)、この場合はcurlの結果をパイプでjqコマンドに渡すのがデータ処理をするのに便利です。jqコマンドはjsonデータを整形・加工するのに便利なコマンドです。
curlとjqを組み合わせた使用例は別ページで少し書いていますので、そちらを参考にしてください。
自分のグローバルIPアドレス・プライベートIPアドレスを確認するコマンド色々