わかりやすい curl コマンド例集:詳細な説明付き
はじめに
インターネット上のリソースを取得したり、データとやり取りしたりすることは、現代のコンピューティング環境において日常茶飯事です。ウェブサイトの閲覧はもちろん、APIを介したデータ連携、ファイルのダウンロード、さらには様々なプロトコルを利用した通信まで、その用途は多岐にわたります。これらの操作を手軽に、かつ柔軟に行うための強力なコマンドラインツールが「curl」です。
curlは、URL (Uniform Resource Locator) 構文を使ってデータを転送するためのコマンドラインツールであり、ライブラリでもあります。HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP, LDAPS, POP3, POP3S, IMAP, IMAPS, SMTP, SMTPS, RTMP, RTSP, FILEなど、非常に多くのプロトコルに対応しています。その柔軟性と機能の豊富さから、開発者、システム管理者、テスターなど、幅広いユーザーにとって indispensable (不可欠) なツールとなっています。
なぜcurlを学ぶ必要があるのでしょうか?
* HTTP/HTTPS通信のデバッグとテスト: ウェブサイトやAPIとの通信で何が起きているかを確認するのに最適です。リクエストヘッダー、レスポンスヘッダー、ボディの内容、ステータスコードなどを詳細に確認できます。
* APIテスト: RESTful APIなどのエンドポイントに対して、GET, POST, PUT, DELETEなどのHTTPメソッドを使ってリクエストを送信し、その応答を確認する作業が容易になります。
* ファイルダウンロード: コマンドラインからファイルをダウンロードする際に、進捗表示、中断・再開、速度制限などの機能を活用できます。
* 自動化: シェルスクリプトや他のスクリプト言語と組み合わせることで、定期的なデータ取得やAPI操作などのタスクを自動化できます。
* 様々なプロトコルへの対応: HTTP/HTTPSだけでなく、FTPやSFTPなどを使ったファイル転送もコマンド一つで行えます。
この記事では、curlの基本的な使い方から始め、ファイルダウンロード、HTTPメソッド、ヘッダー操作、クッキー、認証、プロキシ、SSL/TLS、デバッグ、さらには応用的なAPIテストやスクリプトでの利用例まで、幅広くかつ詳細に解説していきます。各セクションでは、具体的なコマンド例とその出力例を豊富に示し、各オプションが何を意味し、どのように動作するのかを丁寧に説明します。この記事が、curlを使い始める方の強力な手助けとなり、さらに深い理解へと繋がることを願っています。
対象読者は、コマンドラインを使った作業に興味がある初心者から、既に基本的なコマンドは使えるがcurlについてもっと深く知りたいという方までを想定しています。さあ、強力なツールであるcurlの世界へ踏み出しましょう。
curlの基本的な使い方
まず、お使いのシステムにcurlがインストールされているか確認しましょう。多くのLinuxディストリビューションやmacOSにはデフォルトでインストールされています。Windowsでも、最近のバージョンではデフォルトで含まれているか、Windows Subsystem for Linux (WSL) を利用すれば簡単に利用できます。確認するには、ターミナルやコマンドプロンプトで以下のコマンドを実行します。
bash
curl --version
もしインストールされていなければ、各OSのパッケージマネージャーを使ってインストールしてください。
* Debian/Ubuntu: sudo apt update && sudo apt install curl
* Fedora/CentOS/RHEL: sudo dnf install curl
または sudo yum install curl
* macOS (Homebrew): brew install curl
(通常はプリインストールされています)
* Windows: chocolateyやwingetなどのパッケージマネージャーを利用するか、公式ウェブサイトからインストーラーをダウンロードしてください。
最もシンプルな使い方:curl [URL]
curlコマンドの最も基本的な使い方は、引数にURLを指定することです。これにより、指定したURLからデータを取得し、標準出力(通常はターミナル画面)に表示します。
例:ウェブサイトのHTMLを取得する
bash
curl https://example.com
このコマンドを実行すると、https://example.com
のウェブサイトのHTMLソースコードがターミナルにずらっと表示されます。これは、curlがデフォルトでGETリクエストを送信し、そのレスポンスボディを標準出力に表示するためです。
HTTPだけでなく、HTTPSサイトへのアクセスも同様に簡単です。curlはデフォルトでHTTPSをサポートしており、SSL/TLS証明書の検証も行います。
出力例 (一部):
“`html
Example Domain
This domain is for use in illustrative examples in documents. You may use this
domain in literature without prior coordination or asking for permission.
“`
このように、コマンド一つで簡単にウェブコンテンツを取得できます。これは、APIの応答を確認したり、スクレイピングの下準備をしたりする際にも役立ちます。
ヘルプの表示
curlには非常に多くのオプションがあります。利用可能なオプションを確認したい場合は、--help
オプションを使うか、man
コマンドでマニュアルページを参照します。
bash
curl --help
man curl
--help
は主要なオプションの短いリストを表示します。man curl
はcurlの全機能、オプション、使い方に関する詳細な公式マニュアルを表示します。非常に長く網羅的ですが、特定の機能を深く調べたい場合に役立ちます。
ここから、様々なオプションを使ってcurlの機能を拡張していく方法を見ていきます。
ファイルダウンロード
curlは、単にウェブコンテンツをターミナルに表示するだけでなく、ファイルをダウンロードしてローカルに保存する機能も強力です。これには主に二つの方法があります。
-o <ファイル名>
オプション:指定したファイル名で保存
このオプションを使うと、ダウンロードしたデータを指定したファイル名で保存できます。
例:ウェブサイトのロゴ画像をダウンロードする
bash
curl -o example.png https://www.example.com/path/to/example-logo.png
このコマンドは、指定されたURLにある画像をダウンロードし、カレントディレクトリに example.png
という名前で保存します。
オプションの説明:
* -o <ファイル名>
: Output file. ダウンロードしたデータを <ファイル名>
で指定したファイルに書き込みます。<ファイル名>
にはパスを含めることもできます(例: -o images/logo.png
)。
ダウンロード中、curlは通常、ダウンロードの進行状況を示すプログレスバーを表示します。
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 12345 100 12345 0 0 98765 0 --:--:-- --:--:-- --:--:-- 98765
このプログレスバーは、合計サイズ、受信済みサイズ、平均速度、残り時間などの情報を示します。
-O
オプション:元のファイル名で保存
ダウンロード元のURLに含まれるファイル名をそのまま利用してファイルを保存したい場合は、-O
(大文字のオー) オプションが便利です。
例:URLからファイル名を取得して保存する
bash
curl -O https://www.example.com/path/to/document.pdf
このコマンドは、https://www.example.com/path/to/document.pdf
からファイルをダウンロードし、カレントディレクトリに document.pdf
という名前で保存します。
オプションの説明:
* -O
: Remote file. ダウンロード元のURLからファイル名を推測し、その名前でローカルに保存します。パス部分は無視され、ファイル名のみが利用されます。
-o
と -O
の違いを理解しておきましょう:
* -o <ファイル名>
: ローカルでのファイル名を自分で指定します。
* -O
: ダウンロード元のファイル名を利用します。
ダウンロードの中断と再開:-C -
オプション
ネットワーク接続が不安定な場合や、非常に大きなファイルをダウンロードする場合、ダウンロードが途中で中断されてしまうことがあります。curlは、 interrupted (中断された) ダウンロードを再開する機能をサポートしています。これには -C
(continue) オプションを使用します。特に便利なのは -C -
という指定です。
例:中断されたダウンロードを再開する
bash
curl -C - -O https://example.com/largefile.zip
オプションの説明:
* -C <オフセット>
: Continue download from a given offset. 指定したバイト数のオフセットからダウンロードを再開します。
* -C -
: 既存のローカルファイルサイズを調べて、そのサイズからダウンロードを再開します。これが最も一般的な再開方法です。
このコマンドを実行すると、もしカレントディレクトリに largefile.zip
というファイルが存在し、かつ完全にダウンロードされていなければ、そのファイルの末尾からダウンロードを再開します。ファイルが存在しない場合は、最初からダウンロードを開始します。
この機能は、大きなファイルのダウンロード中にPCがスリープしたり、ネットワーク接続が一時的に切断されたりした場合に非常に役立ちます。
複数のファイルを同時にダウンロード
厳密には、一つのcurl
コマンドで複数のURLを引数に指定した場合、それらは順番に処理されます。並列にダウンロードするわけではありません。
bash
curl -O https://example.com/file1.zip -O https://example.com/file2.zip -O https://example.com/file3.zip
このコマンドは、まず file1.zip
をダウンロードし、それが完了したら次に file2.zip
をダウンロード、最後に file3.zip
をダウンロードします。-O
オプションを複数回指定することで、それぞれのURLに対して -O
オプションが適用されます。-o
オプションを複数回使う場合は、それぞれの -o
の後に対応するURLを指定します。
bash
curl -o output1.zip https://example.com/file1.zip -o output2.zip https://example.com/file2.zip
もし本当に複数のファイルを同時にダウンロードしたい場合は、シェルのバックグラウンドジョブ機能 (&
) や xargs
、または専用の並列ダウンロードツールなどと組み合わせる必要があります。
例:複数のファイルを並列ダウンロード (シェルスクリプト例)
“`bash
!/bin/bash
urls=(
“https://example.com/fileA.txt”
“https://example.com/fileB.txt”
“https://example.com/fileC.txt”
)
for url in “${urls[@]}”; do
curl -O “$url” & # & をつけてバックグラウンドで実行
done
wait # 全てのバックグラウンドジョブが完了するまで待つ
echo “All downloads complete.”
“`
このスクリプトは、指定したURLリストに対してそれぞれ curl -O
コマンドをバックグラウンドで実行し、複数のダウンロードを同時に進めます。
ダウンロード速度の制限:--limit-rate <速度>
ネットワーク帯域幅を使い切らないように、ダウンロード速度を制限したい場合があります。これには --limit-rate
オプションを使用します。
例:ダウンロード速度を100KB/秒に制限する
bash
curl --limit-rate 100K -O https://example.com/largefile.zip
オプションの説明:
* --limit-rate <速度>
: Limit data transfer speed to specified bytes per second. ダウンロード速度をバイト/秒単位で指定します。単位として ‘k’, ‘m’, ‘g’ をつけることができます(例: 100k
は100キロバイト/秒, 1m
は1メガバイト/秒)。
このオプションは、他のネットワーク利用者がいる環境でダウンロードを行う際に便利です。
HTTPメソッド
インターネット上のリソースにアクセスする際、特にウェブサービスやAPIとのやり取りでは、単にデータを取得するだけでなく、データを送信したり、既存のデータを更新・削除したりといった様々な操作を行います。これらの操作の種類を区別するために使用されるのがHTTPメソッドです。HTTP/1.1の主なメソッドには、GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONSなどがあります。
curlは、これらのHTTPメソッドを柔軟に指定してリクエストを送信できます。デフォルトでは、URLを指定するだけの最も基本的な使い方ではGETメソッドが使用されます。
-X <メソッド名>
オプション
デフォルト以外のHTTPメソッドを使用したい場合は、-X
オプションでメソッド名を指定します。
オプションの説明:
* -X <メソッド名>
: Specify request command to use. 使用するHTTPメソッドを指定します。
GETリクエスト
前述の curl https://example.com
は、-X GET
を明示的に指定した場合と同じです。
bash
curl -X GET https://example.com
GETリクエストは、リソースの取得に使用されます。通常、リクエストボディは持ちません。クエリパラメータはURLの末尾に ?key1=value1&key2=value2
の形式で付加されます。
POSTリクエスト
POSTリクエストは、サーバーにデータを送信する(新しいリソースを作成するなど)ために使用されます。フォームデータの送信や、APIへのデータ送信などでよく使われます。POSTリクエストでは、リクエストボディにデータを格納して送信するのが一般的です。
POSTデータを送信するには、-d
または --data
オプションを使用します。
例:簡単なフォームデータをPOSTする
bash
curl -X POST -d 'username=john_doe&password=secret' https://example.com/login
オプションの説明:
* -d '<データ>'
または --data '<データ>'
: Send data in a POST request. 指定したデータをリクエストボディに含めて送信します。デフォルトでは、このオプションを使用するとHTTPメソッドは自動的にPOSTになります(-X POST
を明示する必要はありませんが、つけても問題ありません)。データはURLエンコードされます。
複数のキー-バリューペアを送信する場合は、&
で区切ります。
例:JSONデータをPOSTする
APIへのデータ送信では、JSON形式のデータがよく使われます。-d
オプションでJSON文字列を送信できますが、重要なのはリクエストヘッダーに Content-Type: application/json
を設定することです。これには -H
オプションを使用します(ヘッダーについては後述)。
bash
curl -X POST \
-H "Content-Type: application/json" \
-d '{"name": "Alice", "age": 30}' \
https://api.example.com/users
この例では、JSON形式の文字列を -d
オプションで指定し、-H "Content-Type: application/json"
を追加して、送信するデータの形式がJSONであることをサーバーに伝えています。-X POST
は -d
オプションがあるので省略可能ですが、明示することで意図がより明確になります。
注意: -d
オプションで送信されるデータは、デフォルトでURLエンコードされます。JSONなどの構造化データを正確に送信したい場合は、多くの場合 Content-Type
ヘッダーの設定が必須です。
--data-urlencode <データ>
オプション
フォームデータを送信する際に、特定の値を確実にURLエンコードしたい場合は --data-urlencode
オプションが便利です。これは -d
と似ていますが、指定したデータが強制的にURLエンコードされます。特に、データ中にスペースや特殊文字が含まれる場合に役立ちます。
例:スペースを含むデータをURLエンコードしてPOSTする
bash
curl -X POST --data-urlencode 'message=Hello World!' https://example.com/post_message
このコマンドは 'message=Hello World!'
というデータをPOSTしますが、'Hello World!'
の部分は 'Hello%20World%21'
のようにURLエンコードされて送信されます。
PUTリクエスト
PUTリクエストは、指定したURLにリソースを作成または更新するために使用されます。通常、リクエストボディにはリソースの完全な内容を含めます。
PUTするデータをファイルから読み込んで送信したい場合は、-T
または --upload-file
オプションが便利です。
例:ファイルをPUTする
“`bash
mydata.txt というファイルの内容を https://example.com/resource/mydata にPUTする
curl -X PUT -T mydata.txt https://example.com/resource/mydata
“`
オプションの説明:
* -T <ファイル名>
または --upload-file <ファイル名>
: Transfer local file to remote URL. 指定したローカルファイルの内容をリクエストボディとして送信します。デフォルトではHTTPメソッドはPUTになります(-X PUT
は省略可能ですが、明示することで分かりやすくなります)。
DELETEリクエスト
DELETEリクエストは、指定したURLのリソースを削除するために使用されます。通常、リクエストボディは持ちません。
例:リソースをDELETEする
bash
curl -X DELETE https://api.example.com/users/123
このコマンドは、https://api.example.com/users/123
にあるユーザーリソースを削除するリクエストを送信します。
その他のHTTPメソッド
curlはHEAD, OPTIONS, PATCHなどの他のHTTPメソッドもサポートしています。これらのメソッドを使用する場合も、同様に -X
オプションでメソッド名を指定します。
例:HEADリクエスト(ヘッダー情報のみを取得)
“`bash
curl -X HEAD https://example.com
または短縮オプションの -I を使う方が一般的
curl -I https://example.com
“`
HEADリクエストは、GETリクエストと同様ですが、レスポンスボディは返されず、ヘッダー情報のみが返されます。リソースの存在確認やヘッダー情報の確認などに利用されます。-I
オプションは -X HEAD
を指定するのと同じ効果があります。
ヘッダー情報の送信と受信 (Headers)
HTTP通信では、リクエストとレスポンスの両方に「ヘッダー」と呼ばれるメタ情報が付加されます。ヘッダーには、コンテンツの種類、エンコーディング、キャッシュ情報、認証情報など、通信に関する様々な情報が含まれています。curlを使うことで、これらのヘッダー情報を詳細に制御したり、確認したりできます。
リクエストヘッダーの送信:-H '<ヘッダー名>: <値>'
サーバーに送信するリクエストにカスタムヘッダーを追加したい場合は、-H
または --header
オプションを使用します。複数のヘッダーを追加するには、-H
オプションを複数回指定します。
オプションの説明:
* -H '<ヘッダー名>: <値>'
: Add a header to the request. 指定したヘッダーとその値をリクエストに含めます。
例:User-Agentヘッダーを変更する
多くのウェブサイトは、リクエスト元のクライアント(ブラウザなど)を識別するためにUser-Agentヘッダーを使用します。curlのデフォルトのUser-Agentは curl/<バージョン>
のようになりますが、これをブラウザのものなどに偽装したい場合があります。
bash
curl -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" https://example.com/info
このコマンドは、指定したURLに対して、一般的なChromeブラウザのようなUser-Agentヘッダーを付けてリクエストを送信します。
例:Content-Typeヘッダーを設定する(特にJSON送信時)
POSTやPUTでデータを送信する際、送信するデータの形式をサーバーに伝えるためにContent-Typeヘッダーを設定することが重要です。JSONデータを送信する場合は application/json
を指定します。
bash
curl -X POST \
-H "Content-Type: application/json" \
-d '{"item": "book", "price": 2000}' \
https://api.example.com/items
これは前述のJSON POSTの例と同じですが、-H
オプションの使われ方を強調しています。
例:Authorizationヘッダーの送信(APIキーやトークン)
APIによっては、認証や認可のためにリクエストヘッダーにAPIキーやOAuth2トークンを含める必要があります。これらも -H
オプションで送信します。
“`bash
APIキーの場合
curl -H “X-API-Key: YOUR_API_KEY” https://api.example.com/data
OAuth2 Bearerトークンの場合
curl -H “Authorization: Bearer YOUR_ACCESS_TOKEN” https://api.example.com/protected_resource
“`
X-API-Key
はカスタムヘッダーの一例です。実際のヘッダー名はAPIの仕様によって異なります。Authorization: Bearer ...
は、OAuth2認証で広く使われる形式です。
レスポンスヘッダーの表示:-i
と -I
オプション
サーバーからのレスポンスに含まれるヘッダー情報を確認したい場合があります。これには -i
または -I
オプションを使用します。
オプションの説明:
* -i
または --include
: Include protocol headers in the output. レスポンスヘッダーとレスポンスボディの両方を標準出力に表示します。
* -I
または --head
: Fetch the HTTP-header only. HEADリクエストを送信し、レスポンスヘッダーのみを標準出力に表示します(-X HEAD
と同じです)。
例:ヘッダーとボディの両方を表示する
bash
curl -i https://example.com
出力例 (一部):
“`
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Etag: “3147526947+ident”
Expires: Tue, 06 Feb 2024 06:18:04 GMT
Last-Modified: Wed, 16 Oct 2019 07:18:26 GMT
Server: ECS (iad/183)
Vary: Accept-Encoding
Content-Length: 1270
… (以下、HTMLボディが続く)
“`
この出力例を見ると、HTTPステータスコード (`HTTP/1.1 200 OK`)、Content-Type, Content-Length, Cache-Control, Expires, Serverなどの様々なヘッダー情報が表示されていることがわかります。ヘッダー情報は、ボディ本体の上に空行を挟んで表示されます。
例:ヘッダーのみを表示する
“`bash
curl -I https://example.com
“`
**出力例 (一部):**
“`
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Etag: “3147526947+ident”
Expires: Tue, 06 Feb 2024 06:18:04 GMT
Last-Modified: Wed, 16 Oct 2019 07:18:26 GMT
Server: ECS (iad/183)
Vary: Accept-Encoding
Content-Length: 1270
“`
`-I` オプションを使うと、ボディは表示されず、ヘッダー情報のみが表示されます。これは、ファイルサイズや最終更新日時、リダイレクト先などを素早く確認したい場合に便利です。
#### 特定のヘッダーのみを抽出
表示されたヘッダー情報の中から、特定のヘッダーの値だけを取り出したい場合は、grepなどのテキスト処理ツールと組み合わせます。
例:Content-Typeヘッダーの値を取得する
“`bash
curl -I https://example.com | grep Content-Type
“`
**出力例:**
“`
Content-Type: text/html; charset=UTF-8
“`
さらに、`awk` や `cut` などを使えば、ヘッダー名を除いた値だけを取り出すことも可能です。
“`bash
curl -I https://example.com | grep Content-Type | cut -d’ ‘ -f2-
“`
**出力例:**
“`
text/html; charset=UTF-8
“`
### クッキー (Cookies)
クッキーは、ウェブサイトがユーザーのブラウザに保存する小さなデータ片で、セッション管理、ユーザー設定の記憶、トラッキングなどに利用されます。curlを使ってウェブサイトとやり取りする際、クッキーを送受信して、ブラウザでアクセスしているかのように振る舞うことができます。
#### クッキーの送信:`-b ‘<クッキー文字列>‘` または `-b <ファイル名>`
サーバーにリクエストを送信する際に、特定のクッキーを含めたい場合は `-b` または `–cookie` オプションを使用します。
**オプションの説明:**
* `-b ‘<クッキー文字列>‘`: Send the specified string as a cookie. `’name1=value1; name2=value2’` のような形式でクッキー文字列を直接指定します。
* `-b <ファイル名>`: Read cookies from the specified file and send them. 指定したファイルからクッキー情報を読み込んで送信します。このファイル形式は、Netscapeのクッキーファイル形式やlibcurlが独自に定義した形式です。
例:クッキー文字列を直接指定して送信する
“`bash
curl -b “sessionid=abcdef123456; language=en” https://example.com/profile
“`
このコマンドは、`sessionid` と `language` というクッキーを付けて `https://example.com/profile` にアクセスします。
例:ファイルからクッキーを読み込んで送信する
まず、クッキーを保存したファイルが必要です(保存方法は後述)。例えば、`cookies.txt` というファイルにクッキーが保存されているとします。
“`bash
curl -b cookies.txt https://example.com/members_only
“`
このコマンドは、`cookies.txt` に保存されているクッキー情報をリクエストに含めて送信します。これにより、以前のセッション情報などを引き継いだアクセスが可能になります。
#### クッキーの保存:`-c <ファイル名>`
サーバーからのレスポンスに含まれる `Set-Cookie` ヘッダーによって設定されるクッキー情報を保存したい場合は、`-c` または `–cookie-jar` オプションを使用します。
**オプションの説明:**
* `-c <ファイル名>`: Write received cookies to the specified file. レスポンスで受け取ったクッキーを指定したファイルに保存します。ファイルが存在しない場合は新しく作成されます。
例:クッキーをファイルに保存する
“`bash
curl -c my_cookies.txt https://example.com/login
“`
このコマンドは `https://example.com/login` にアクセスし、そのレスポンスで設定されるクッキー(例えばセッションIDなど)を `my_cookies.txt` というファイルに保存します。`my_cookies.txt` は Netscape クッキーファイル形式のようなテキスト形式で保存されます。
`my_cookies.txt` の内容例(ファイル形式の詳細は異なる場合があります):
“`
# Netscape HTTP Cookie File
# https://curl.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.
.example.com TRUE / FALSE 1678886400 sessionid abcdef123456
“`
#### セッション管理や認証が必要な場合の例
クッキーの送信と保存を組み合わせることで、ウェブサイトでのセッションを維持したり、ログインが必要なページにアクセスしたりすることができます。
シナリオ:ログインして、会員限定ページにアクセスする
1. ログインページにPOSTリクエストを送信し、クッキーを保存する。
2. 保存したクッキーを使って、会員限定ページにGETリクエストを送信する。
“`bash
# 1. ログインリクエストを送信し、クッキーを保存
curl -c auth_cookies.txt \
-d ‘username=testuser&password=mypassword’ \
https://example.com/login_process
# 2. 保存したクッキーを使って会員限定ページにアクセス
curl -b auth_cookies.txt https://example.com/member_area
“`
最初のコマンドでログイン処理を行い、サーバーから発行されたセッションクッキー(`Set-Cookie` ヘッダーに含まれる)が `auth_cookies.txt` に保存されます。次のコマンドでは、その `auth_cookies.txt` からクッキーを読み込んでリクエストに含めるため、サーバーはログイン済みユーザーからのアクセスと認識し、会員限定ページの内容を返します。
このように、クッキー機能を活用することで、ブラウザでの操作に近いウェブサイトとのインタラクションをコマンドラインで実現できます。
### 認証 (Authentication)
ウェブサイトやAPIの中には、アクセスするために認証を必要とするものがあります。curlは様々な認証方式に対応していますが、ここでは最も一般的でシンプルな「ベーシック認証」について説明します。
#### ベーシック認証:`-u ‘<ユーザー名>:<パスワード>‘`
ベーシック認証 (Basic Authentication) は、HTTPヘッダーにユーザー名とパスワードを Base64 エンコードした文字列を含めて送信するシンプルな認証方式です。これを行うには、`-u` または `–user` オプションを使用します。
**オプションの説明:**
* `-u ‘<ユーザー名>:<パスワード>‘`: Specify the user name and password to use for server authentication. ユーザー名とパスワードを `:` で区切って指定します。
例:ベーシック認証が必要なページにアクセスする
“`bash
curl -u ‘myuser:mypass’ https://example.com/protected/resource
“`
このコマンドを実行すると、curlはリクエストヘッダーに `Authorization: Basic
ユーザー名やパスワードに `:` が含まれる場合は、URLエンコードではなく、別の方法で指定する必要があるか、または引用符で囲むなどの工夫が必要です。複雑なパスワードの場合は、パスワード部分を省略して `curl -u ‘myuser:’ https://example.com/…` のように実行すると、curlがインタラクティブにパスワード入力を促してくれます。
**セキュリティ上の注意:**
ベーシック認証は、ユーザー名とパスワードが単にBase64エンコードされるだけで、暗号化されるわけではありません。HTTPS接続 (`https://`) を使用しない場合、ネットワーク上の第三者にユーザー名とパスワードを傍受されるリスクがあります。機密性の高い情報を含む認証には、必ずHTTPSを使用してください。curlはHTTPSでのベーシック認証も問題なくサポートします。
### プロキシ (Proxy)
ネットワーク環境によっては、インターネットに直接アクセスできない場合や、特定のサーバーを経由してアクセスする必要がある場合があります。このような状況で利用されるのがプロキシサーバーです。curlはプロキシ経由でのアクセスをサポートしています。
#### プロキシ経由でのアクセス:`-x <プロキシサーバー>:<ポート>`
プロキシサーバーを指定してリクエストを送信するには、`-x` または `–proxy` オプションを使用します。
**オプションの説明:**
* `-x <プロキシサーバー>:<ポート>`: Use the specified HTTP proxy. プロキシサーバーのホスト名またはIPアドレスとポート番号を `:` で区切って指定します。プロトコル (`http://`, `https://`, `socks5://` など) を含めることもできます。省略した場合は `http://` とみなされることが多いです。
例:HTTPプロキシを経由してウェブサイトにアクセスする
“`bash
curl -x http://proxy.example.com:8080 https://example.com
“`
このコマンドは、`http://proxy.example.com:8080` というプロキシサーバーを経由して `https://example.com` にアクセスします。
プロキシサーバーのプロトコルも指定できます。
“`bash
curl -x socks5://socks.example.com:1080 https://example.com
“`
#### プロキシ認証:`-U ‘<ユーザー名>:<パスワード>‘`
プロキシサーバーによっては、アクセスするために認証が必要な場合があります。プロキシ認証情報を指定するには、`-U` または `–proxy-user` オプションを使用します。これは `-x` オプションと組み合わせて使用します。
**オプションの説明:**
* `-U ‘<ユーザー名>:<パスワード>‘`: Specify the user name and password to use for proxy authentication. プロキシ認証用のユーザー名とパスワードを `:` で区切って指定します。
例:認証が必要なプロキシを経由してアクセスする
“`bash
curl -x http://proxy.example.com:8080 -U ‘proxyuser:proxypass’ https://example.com
“`
このコマンドは、`proxyuser:proxypass` という認証情報を使ってプロキシサーバーにログインし、そのプロキシを経由して目的のURLにアクセスします。
プロキシ設定は、環境変数 `http_proxy`, `https_proxy`, `ftp_proxy`, `all_proxy` などでも指定できます。環境変数で設定されている場合、通常は `-x` オプションの設定が優先されます。
### SSL/TLS (HTTPS)
インターネット上の通信の多くは、セキュリティ確保のためにSSL/TLSプロトコルで暗号化されています。HTTPSは、HTTP通信をSSL/TLSで暗号化したものです。curlはデフォルトでHTTPSをサポートしており、安全な通信を提供します。
#### HTTPSサイトへの基本的なアクセス
前述の基本的な使い方のセクションで示したように、HTTPSサイトへのアクセスはURLに `https://` を指定するだけで可能です。
“`bash
curl https://encrypted.example.com
“`
curlは、HTTPS接続を行う際に、サーバーから提示されるSSL/TLS証明書を検証します。これは、アクセスしているサーバーが信頼できる正規のものであることを確認するための重要なセキュリティ機能です。curlは、システムにインストールされている信頼された認証局 (CA) の証明書リストを使って検証を行います。
#### 証明書の検証を無効にする(非推奨):`-k` または `–insecure`
開発環境やテスト環境など、正しく設定されていないSSL/TLS証明書を持つサーバーにアクセスする必要がある場合があります。このような場合、curlは証明書検証エラーで通信を拒否します。一時的に証明書検証を無効にするには、`-k` または `–insecure` オプションを使用します。
**オプションの説明:**
* `-k` または `–insecure`: Allow curl to proceed even if it doesn’t seem safe. 証明書検証エラーが発生しても処理を続行します。
例:証明書検証をスキップしてHTTPSサイトにアクセスする
“`bash
curl -k https://untrusted-cert.example.com
“`
**警告:** `-k` オプションはセキュリティリスクを高めます。このオプションを使用すると、curlは偽装されたサーバーにも接続してしまう可能性があります。**本番環境や機密性の高い通信には絶対にこのオプションを使用しないでください。** デバッグやテスト目的でのみ、リスクを理解した上で使用してください。
#### 特定のCA証明書を指定する:`–cacert <ファイル名>`
システムのデフォルトのCA証明書リストではなく、特定のCA証明書ファイルを使ってサーバー証明書を検証したい場合は、`–cacert` オプションを使用します。
**オプションの説明:**
* `–cacert <ファイル名>`: Use the specified certificate file as the CA bundle. 指定したファイルに含まれるCA証明書を使ってサーバー証明書を検証します。このファイルは通常、複数のCA証明書を連結したPEM形式のファイルです。
企業内のプライベートCAによって発行された証明書を持つサーバーにアクセスする場合などに利用されます。
#### クライアント証明書を指定する:`–cert <ファイル名> –key <ファイル名>`
相互認証が必要なSSL/TLS接続では、クライアント側もサーバーに対して自身の証明書を提示する必要があります。クライアント証明書認証を行うには、`–cert` オプションでクライアント証明書ファイル(PEM形式など)、`–key` オプションで対応する秘密鍵ファイルを指定します。
**オプションの説明:**
* `–cert <ファイル名>`: Client certificate file.
* `–key <ファイル名>`: Private key file for the client certificate.
例:クライアント証明書を使ってHTTPSサイトにアクセスする
“`bash
curl –cert client.pem –key client.key https://secure.example.com/mutual_auth
“`
秘密鍵ファイルにパスフレーズが設定されている場合は、curlが実行時にパスフレーズの入力を求めてきます。`–cert-type` や `–key-type` オプションでファイル形式(PEM, DER, P12など)を指定することもできますが、通常はファイル拡張子から自動的に判断されます。
### エラーハンドリングとデバッグ
ネットワーク通信は、様々な要因で失敗する可能性があります。サーバーの応答がない、認証に失敗する、リソースが見つからない、タイムアウトするなど、エラーの原因は多岐にわたります。curlは、これらの状況を把握し、デバッグするための様々な機能を提供しています。
#### HTTPステータスコードの確認
ウェブサーバーからのレスポンスには、必ずHTTPステータスコードが含まれています(例: 200 OK, 404 Not Found, 500 Internal Server Error)。このコードは、リクエストが成功したか、失敗したか、どのような種類のエラーが発生したかなどを示します。前述の `-i` オプションを使えば、レスポンスヘッダーに含まれるステータスコードを確認できます。
“`bash
curl -i https://example.com/nonexistent
“`
**出力例 (一部):**
“`
HTTP/1.1 404 Not Found
…
“`
この例では、存在しないURLにアクセスしたため、`404 Not Found` というステータスコードが返されています。
#### 詳細な情報を表示する:`-v` または `–verbose`
通信がうまくいかない場合、リクエストがどのように構築され、サーバーがどのように応答しているかを詳細に確認することがデバッグの第一歩です。`-v` または `–verbose` オプションは、curlが実行しているステップや送受信している生データ(ヘッダー、SSL/TLS接続情報など)を詳細に表示してくれます。
**オプションの説明:**
* `-v` または `–verbose`: Make the operation more talkative. 処理の詳細なログを標準エラー出力 (`stderr`) に表示します。
例:詳細モードでリクエストを送信する
“`bash
curl -v https://example.com
“`
**出力例 (一部):**
“`
* Trying 93.184.216.34:443…
* Connected to example.com (93.184.216.34) port 443 (#0)
* ALPN: offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / AEAD-AES128-GCM-SHA256
* ALPN: server accepted h2
* Server certificate:
* subject: C=US; O=DigiCert Inc; CN=DigiCert TLS Hybrid ECC SHA256 2020 CA1
* issuer: C=US; O=DigiCert Inc; OU=www.digicert.com; CN=DigiCert Global Root G2
* SSL certificate verify ok.
> GET / HTTP/2
> Host: example.com
> user-agent: curl/7.81.0
> accept: */*
>
< HTTP/2 200
< date: Mon, 29 Jan 2024 10:00:00 GMT
< content-type: text/html; charset=UTF-8
< etag: "3147526947+ident"
< expires: Mon, 05 Feb 2024 10:00:00 GMT
< cache-control: max-age=604800
< last-modified: Wed, 16 Oct 2019 07:18:26 GMT
< server: ECS (iad/183)
< vary: Accept-Encoding
< content-length: 1270
<
{ [1270 bytes data]
* Connection #0 to host example.com left intact
```
この出力では、接続先のIPアドレス、ポート、TLS/SSLのバージョン、証明書情報、送信したリクエストヘッダー (`> ` で始まる行)、受信したレスポンスヘッダー (`< ` で始まる行) など、非常に詳細な情報が表示されています。これにより、どこで通信が失敗しているか、どのようなヘッダーが送受信されているかなどを正確に把握できます。
`-v` オプションは、特にAPI連携のデバッグや、予期しないレスポンスの原因調査に非常に役立ちます。
#### コマンドの実行時間計測:`--write-out <形式文字列>`
curlコマンドの実行にかかった時間や、その他の統計情報を取得したい場合があります。これには `–write-out` または `-w` オプションを使用します。このオプションには、表示したい情報の形式を指定する文字列を渡します。
**オプションの説明:**
* `-w <形式文字列>`: Format output after completion. コマンド完了後、指定された形式文字列に従って情報を標準出力に書き出します。形式文字列には、様々な変数(例: `%{time_total}`, `%{http_code}`)やエスケープシーケンス(例: `\n`)を含めることができます。
例:HTTPステータスコードと合計実行時間を表示する
“`bash
curl -s -w “HTTP Code: %{http_code}\nTotal Time: %{time_total} seconds\n” https://example.com
“`
**オプションの説明:**
* `-s` または `–silent`: Silent mode. プログレスバーやエラーメッセージなどを非表示にします。`–write-out` で指定した情報のみを表示したい場合に便利です。
* `%{http_code}`: 最後のHTTPステータスコード。
* `%{time_total}`: 全体の処理にかかった時間(秒)。
**出力例:**
“`
HTTP Code: 200
Total Time: 0.123456 seconds
“`
他にも様々な変数があります(`%{size_download}`, `%{speed_download}`, `%{url_effective}` など)。詳細は `man curl` または公式ドキュメントで `–write-out` のセクションを参照してください。APIの応答時間計測などに利用できます。
#### リダイレクトの処理:`-L` または `–location`
ウェブサイトにアクセスした際に、目的のページが別のURLに移動していることがあります(リダイレクト、HTTPステータスコード 3xx)。ブラウザは自動的にリダイレクト先に追従しますが、curlはデフォルトではリダイレクトに追従しません。リダイレクト先に自動的に追従させたい場合は、`-L` または `–location` オプションを使用します。
**オプションの説明:**
* `-L` または `–location`: Follow redirects. サーバーからリダイレクトを示すレスポンス (3xx ステータスコード) を受け取った場合、Locationヘッダーで指定された新しいURLに自動的にリクエストを再送信します。
例:リダイレクトを含むURLにアクセスする
“`bash
curl -L http://short.example.com/redirect_me
“`
このコマンドは、`http://short.example.com/redirect_me` にアクセスし、もしこのURLが別のURLにリダイレクトする場合、自動的にそのリダイレクト先のURLからデータを取得します。`-L` オプションがない場合、curlはリダイレクト応答(例: 301 Moved Permanently, 302 Found)をそのまま表示して終了します。
複数のリダイレクトが発生する場合でも、デフォルトでは最大5回まで追従します(`–max-redirs` オプションで変更可能)。
### 応用例
基本的な機能を組み合わせることで、curlはより複雑なタスクやデバッグシナリオに対応できます。ここではいくつかの応用例を紹介します。
#### APIエンドポイントへのテスト
開発やデバッグにおいて、APIエンドポイントが期待通りに動作するかをテストすることは非常に重要です。curlは、様々なHTTPメソッド、ヘッダー、データを組み合わせてリクエストを送信できるため、APIテストツールとして非常に強力です。
例:RESTful APIでTodoリストを作成し、取得し、更新し、削除する
架空のTodoリストAPI (`https://api.example.com/todos`) を想定します。
1. **GET:** 全てのTodoを取得する
“`bash
curl https://api.example.com/todos
# または
curl -X GET https://api.example.com/todos
“`
出力はTodoリストのJSON配列になるはずです。
2. **POST:** 新しいTodoを作成する(タイトルを指定)
“`bash
curl -X POST \
-H “Content-Type: application/json” \
-d ‘{“title”: “Buy groceries”, “completed”: false}’ \
https://api.example.com/todos
“`
成功すると、作成されたTodoの詳細(IDなどを含むJSONオブジェクト)が返されることが多いです。返されたIDを後続の操作で使います(例: IDが `42` だったとする)。
3. **GET (個別):** 特定のTodoを取得する(IDを指定)
“`bash
curl https://api.example.com/todos/42
# または
curl -X GET https://api.example.com/todos/42
“`
出力はID 42のTodoの詳細JSONオブジェクトになるはずです。
4. **PUT:** 特定のTodoを更新する(IDを指定、例えば完了状態にする)
“`bash
curl -X PUT \
-H “Content-Type: application/json” \
-d ‘{“title”: “Buy groceries”, “completed”: true}’ \
https://api.example.com/todos/42
“`
更新されたTodoの詳細が返されることが多いです。
5. **DELETE:** 特定のTodoを削除する(IDを指定)
“`bash
curl -X DELETE https://api.example.com/todos/42
“`
成功すると、空のレスポンスボディや成功を示すJSONオブジェクト、あるいは削除されたリソースのIDなどが返されることがあります。
これらの例のように、`-X`, `-H`, `-d` オプションを組み合わせることで、様々なAPI操作をシミュレートできます。APIのドキュメントを参照しながら、必要なHTTPメソッド、エンドポイントURL、ヘッダー、リクエストボディを確認し、curlコマンドを組み立てる練習をすると良いでしょう。
#### FTP/FTPS/SFTPでのファイル操作
curlはHTTP/HTTPSだけでなく、FTPやSFTPなどのファイル転送プロトコルもサポートしています。
例:FTPサーバーからファイルをダウンロードする
“`bash
curl -u ‘ftpuser:ftppassword’ ftp://ftp.example.com/path/to/remote_file.zip -o local_file.zip
“`
**オプションの説明:**
* `ftp://…`: FTPプロトコルを指定します。
* `-u ‘ユーザー名:パスワード’`: 認証情報を指定します(匿名ログインの場合は省略または `-u anonymous:`)。
* `-o <ファイル名>`: ダウンロードしたファイルを指定した名前で保存します。
例:SFTPサーバーにファイルをアップロードする
“`bash
curl -u ‘sftpuser:sftppassword’ -T local_file.txt sftp://sftp.example.com/path/to/remote_directory/uploaded_file.txt
“`
**オプションの説明:**
* `sftp://…`: SFTPプロトコルを指定します。
* `-T <ファイル名>`: 指定したローカルファイルをリモートにアップロードします。アップロード先のURLのファイル名は、リモートでのファイル名になります。
FTP/SFTP接続には、ユーザー名とパスワードの代わりに公開鍵認証を使用することもできます。curlは `–pubkey` や `–key` などのオプションで鍵ファイルを指定してSFTP接続を行うことも可能です。
#### フォームデータの送信(multipart/form-data)
ウェブサイトのファイルアップロードフォームなどで使用される `multipart/form-data` 形式でデータを送信したい場合は、`-F` または `–form` オプションを使用します。これは、キー-バリューペアやファイルの内容を一度のリクエストで送信する際に便利です。
**オプションの説明:**
* `-F ‘<名前>=<値>‘`: Send form data with the specified name and value.
* `-F ‘<名前>=@<ファイル名>‘`: Send form data with the specified name, taking the value from the content of the specified file.
例:テキストフィールドとファイルを含むフォームデータを送信する
“`bash
curl -X POST \
-F ‘username=john’ \
-F ‘profile_picture=@/path/to/my_photo.jpg’ \
-F ‘description=My profile picture.’ \
https://example.com/upload
“`
このコマンドは、`username`, `profile_picture`, `description` という3つのフィールドを持つフォームデータを送信します。`username` と `description` は通常のテキストデータですが、`profile_picture` は `@` を使って指定されており、`/path/to/my_photo.jpg` ファイルの内容がバイナリデータとして送信されます。curlは自動的に適切な `Content-Type` ヘッダー(通常は `multipart/form-data`)を設定し、各パートのヘッダー(`Content-Disposition`, `Content-Type` など)も適切に生成します。
この機能は、ファイルアップロード機能を持つAPIやウェブサイトのテストに非常に役立ちます。
### スクリプトでの利用
curlはコマンドラインツールであるため、シェルスクリプトや他のプログラム言語から簡単に呼び出すことができます。これにより、ネットワーク操作を含む様々なタスクを自動化できます。
#### シェルスクリプトでの利用方法
シェルスクリプト内でcurlを実行し、その出力や終了ステータスを利用することができます。
例:ウェブサイトのHTTPステータスコードをチェックするスクリプト
“`bash
#!/bin/bash
URL=”https://example.com”
# -s で出力を抑制し、-w でステータスコードのみを取得
STATUS_CODE=$(curl -s -w “%{http_code}” “$URL”)
if [ “$STATUS_CODE” -eq 200 ]; then
echo “Website $URL is up (Status: $STATUS_CODE).”
else
echo “Website $URL is down or returned an error (Status: $STATUS_CODE).”
fi
# $? で curl コマンド自体の終了ステータスを確認することも重要
# (ネットワークエラーなど、HTTP以外のエラーの場合)
if [ $? -ne 0 ]; then
echo “curl command failed for $URL.”
fi
“`
**解説:**
* `STATUS_CODE=$(…)`: curlコマンドの出力を変数 `STATUS_CODE` に格納します。`-s` オプションで通常の出力を抑制し、`-w “%{http_code}”` でステータスコードのみを標準出力に書き出させています。
* `if [ “$STATUS_CODE” -eq 200 ]`: 取得したステータスコードが200 (OK) かどうかをチェックしています。
* `if [ $? -ne 0 ]`: 最後に実行されたコマンド(この場合はcurl)の終了ステータスを `$?` で取得し、それが0以外(通常はエラーを示す)かどうかを確認しています。ネットワークに接続できないなど、HTTPステータスコードを取得する以前の段階でエラーが発生した場合にこのチェックが役立ちます。
#### 結果のパース(`jq` などと組み合わせる)
APIからの応答がJSON形式であることが多いですが、シェルスクリプト内でJSONデータを処理するのは複雑です。このような場合、`jq` のようなJSON処理ツールと組み合わせると便利です。
例:APIからJSONデータを取得し、特定のフィールドを抽出する
“`bash
#!/bin/bash
API_URL=”https://api.example.com/users/123″
# curlでJSONを取得し、jqでnameフィールドを抽出
USER_NAME=$(curl -s “$API_URL” | jq -r ‘.name’)
if [ -n “$USER_NAME” ]; then
echo “User’s name: $USER_NAME”
else
echo “Failed to get user name.”
fi
“`
**解説:**
* `curl -s “$API_URL”`: APIからJSONデータを取得し、標準出力に送ります (`-s` でプログレスバーなどを非表示に)。
* `|`: パイプを使ってcurlの出力を次のコマンドの入力に渡します。
* `jq -r ‘.name’`: `jq` コマンドはJSONデータを処理します。`.name` はJSONオブジェクトの `name` フィールドを指定しています。`-r` オプションは、結果をraw文字列(引用符なし)で出力します。`jq` の出力が変数 `USER_NAME` に格納されます。
`jq` はJSONデータのフィルタリング、変換、抽出に非常に強力なツールです。curlで取得したJSONデータを `jq` にパイプで渡すパターンは、API操作を自動化する上で頻繁に利用されます。
### よくある質問とトラブルシューティング
curlを使用している際に遭遇しやすい問題とその解決策について説明します。
#### 証明書エラー (SSL certificate problem)
最もよく遭遇するエラーの一つがSSL/TLS証明書に関するエラーです。
“`
curl: (60) SSL certificate problem: unable to get local issuer certificate
“`
または類似のエラーメッセージが表示されます。これは、curlがサーバーから提示された証明書を信頼できない場合に発生します。原因はいくつか考えられます。
* **自己署名証明書:** サーバーがパブリックCAではなく、自身で署名した証明書を使用している。
* **中間証明書の不足:** サーバーが中間証明書を正しく提供していない。
* **CA証明書リストが古い/不正:** curlが参照するCA証明書リストが最新でないか、破損している。
* **ホスト名の不一致:** 証明書に記載されているホスト名と、アクセスしようとしているURLのホスト名が一致しない。
**解決策:**
1. **正規の証明書を使う:** サーバー側で信頼できるパブリックCAまたは企業内のCAによって発行された正規の証明書を使用するように設定します。中間証明書チェーンも正しく設定されているか確認します。
2. **CA証明書リストを更新/指定:** システムのCA証明書リストを最新の状態に更新します。または、`–cacert <ファイル名>` オプションで信頼できるCA証明書ファイルを明示的に指定します。
3. **検証を無効にする(非推奨):** デバッグやテスト目的で、`-k` または `–insecure` オプションを使って証明書検証を一時的に無効にします。**本番環境では絶対に使用しないでください。**
4. **`–resolve` を使う:** ホスト名の不一致エラーの場合、`–resolve host:port:address` オプションを使って、特定のホスト名を特定のアドレスに強制的に解決させ、証明書検証を通すことができる場合があります(DNS解決の問題やローカル開発環境で便利)。
#### タイムアウトエラー
サーバーからの応答が遅い場合や、ネットワークの問題で接続が確立できない場合にタイムアウトエラーが発生することがあります。
“`
curl: (28) Connection timed out after XXX milliseconds
“`
**解決策:**
1. **タイムアウト値を調整:** `–connect-timeout <秒>` オプションで接続確立までのタイムアウト、`–max-time <秒>` オプションで全体の処理のタイムアウトを指定できます。応答が遅いサーバーにアクセスする場合、これらの値を増やしてみてください。
“`bash
curl –connect-timeout 10 –max-time 30 https://slow.example.com
“`
2. **サーバーの状態を確認:** アクセス先のサーバーが過負荷になっていないか、または停止していないかを確認します。
3. **ネットワーク接続を確認:** ローカルネットワークやインターネット接続に問題がないか確認します。プロキシを使用している場合は、プロキシサーバーが正常に動作しているか確認します。
#### 接続拒否 (Connection refused)
指定したホストやポートへの接続がサーバー側で拒否された場合に発生します。
“`
curl: (7) Failed to connect to example.com port 80: Connection refused
“`
**解決策:**
1. **ポート番号を確認:** アクセスしようとしているポート番号が正しいか確認します(HTTPは通常80、HTTPSは443)。
2. **ファイアウォールを確認:** クライアント側またはサーバー側のファイアウォールが接続をブロックしていないか確認します。
3. **サーバーが稼働しているか確認:** サービス(ウェブサーバーなど)が指定したポートで正常に稼働しているか確認します。
#### リダイレクトされない
デフォルトでは、curlはリダイレクトに追従しません。リダイレクトを示すレスポンス(3xxステータスコード)を受け取ると、そのヘッダー情報を表示して終了します。
**解決策:**
* **`-L` オプションを使用:** リダイレクト先に自動的に追従させたい場合は、`-L` または `–location` オプションを使用します。
これらのトラブルシューティングのステップは、`-v` オプションと組み合わせることで、問題の特定に役立ちます。`-v` オプションの出力を見ることで、どこまで通信が進んでいるのか(DNS解決、TCP接続、SSL/TLSハンドシェイク、リクエスト送信、レスポンス受信など)を確認し、問題が発生しているフェーズを絞り込むことができます。
### まとめ
この記事では、コマンドラインツールcurlの基本的な使い方から応用例、そしてトラブルシューティングまで、幅広く詳細に解説しました。
curlは単にウェブサイトのHTMLを取得するだけでなく、HTTP/HTTPS通信のあらゆる側面を制御できる強力なツールです。ファイルダウンロード、様々なHTTPメソッドを使ったAPIテスト、ヘッダー操作、クッキーや認証の利用、プロキシ経由のアクセス、SSL/TLS設定、そして詳細なデバッグ情報の取得など、その機能は多岐にわたります。
学んだ主要な点を振り返りましょう。
* `curl [URL]`: 最も基本的な使い方。GETリクエストでコンテンツを取得し標準出力に表示。
* `-o <ファイル名>`, `-O`: ファイルをローカルに保存。
* `-C -`: ダウンロードの中断・再開。
* `-X <メソッド名>`: HTTPメソッドを指定 (POST, PUT, DELETEなど)。
* `-d ‘<データ>‘`, `–data-urlencode`: POSTデータを送信。
* `-H ‘<ヘッダー名>: <値>‘`: リクエストヘッダーを追加。
* `-i`, `-I`: レスポンスヘッダーを表示。
* `-b <ファイル名>`, `-c <ファイル名>`: クッキーを送受信。
* `-u ‘<ユーザー名>:<パスワード>‘`: ベーシック認証。
* `-x <プロキシ>:<ポート>`: プロキシ経由でアクセス。
* `-k`, `–cacert`, `–cert`, `–key`: SSL/TLSの設定と証明書制御。
* `-v`: 詳細なデバッグ情報を表示。
* `-w <形式文字列>`: 実行統計情報を出力。
* `-L`: リダイレクトに追従。
* `-F ‘<名前>=<値>‘`, `-F ‘<名前>=@<ファイル名>‘`: multipart/form-data形式でフォームデータを送信。
これらの機能を組み合わせることで、ウェブ開発、API開発、システム運用、ネットワークデバッグなど、様々な場面でcurlを効果的に活用できます。特に、APIエンドポイントへのリクエスト送信と応答確認は、開発中のテストや本番環境での簡単な疎通確認に非常に役立ちます。また、シェルスクリプトに組み込めば、定期的なデータ取得や自動テストなども実現可能です。
この記事で紹介した機能は、curlが持つ膨大なオプションのほんの一部です。さらに詳しい情報や、ここで触れられなかった高度な機能(例えば、HTTP/2やQUIC、多重転送、帯域幅のスケジューリングなど)については、公式ドキュメントを参照することをお勧めします。
* **curl 公式ウェブサイト:** [https://curl.se/](https://curl.se/)
* **curl マニュアルページ:** `man curl` コマンドまたはオンラインマニュアル [https://curl.se/docs/manual.html](https://curl.se/docs/manual.html)
`man curl` コマンドは、お使いのシステムにインストールされているcurlのバージョンに対応した詳細なドキュメントであり、最も信頼できる情報源です。特定のオプションの使い方に迷った際には、ぜひ参照してみてください。
curlは、シンプルでありながら非常に奥深いツールです。この記事が、皆さんのcurlマスターへの第一歩となり、日々の作業効率向上に繋がることを願っています。練習あるのみ!色々なURLに対して様々なオプションを試してみてください。