curlコマンドとは?目的別の使い方と基本を解説


curlコマンドとは?目的別の使い方と基本を徹底解説

はじめに

インターネットは、私たちの日常生活やビジネスにおいて不可欠なインフラとなっています。Webサイトの閲覧、オンラインショッピング、クラウドサービスの利用、アプリケーション間のデータ連携など、あらゆる活動がインターネット上で行われています。これらの活動の裏側では、コンピュータ同士が様々なプロトコル(通信規約)を使ってデータをやり取りしています。

このデータのやり取りを手軽に、そして強力に制御できるコマンドラインツールが「curl」(カール)です。多くの開発者、システム管理者、そしてインターネットに関わる人々にとって、curlはなくてはならないツールとなっています。Webページの取得から、複雑なAPIのテスト、ファイルのダウンロード・アップロード、ネットワークの診断まで、curlは非常に幅広い用途に対応できます。

しかし、その機能の豊富さゆえに、初心者にとっては多くのオプションが難解に感じられるかもしれません。この記事では、curlコマンドの「基本のキ」から始まり、HTTP/HTTPSを始めとする様々なプロトコルでのデータ送受信、認証、セキュリティ、さらにはWeb開発、システム管理、ファイル操作といった「目的別の実践的な使い方」までを、豊富な具体例とともに徹底的に解説します。この記事を読めば、あなたのインターネットとの関わり方が大きく変わるはずです。さあ、curlの強力な世界への扉を開きましょう。

1. curlコマンドの基礎中の基礎

1.1 curlとは何か? (Client for URLs)

curlは、正確には「Client for URLs」の略称であり、指定されたURLを使ってデータを転送するためのコマンドラインツールおよびライブラリ(libcurl)です。もともとはFTPのダウンロードツールとして開発されましたが、現在ではHTTP、HTTPS、FTP、FTPS、SCP、SFTP、TFTP、DICT、TELNET、LDAP、LDAPS、FILE、POP3、POP3S、IMAP、IMAPS、SMTP、SMTPS、RTMP、RTSP、SOCKS4、SOCKS5など、非常に多くのプロトコルに対応しています。

curlの最大の強みは、これらの多様なプロトコルを使って、コマンド一つでサーバーからデータを取得したり、サーバーへデータを送信したりできる点にあります。Webブラウザが主にHTTP/HTTPSでWebページを表示するために特化しているのに対し、curlはより汎用的で、プログラムが他のシステムと連携するためのデータ転送や、開発者がAPIの動作確認を行う際などに威力を発揮します。

1.2 なぜcurlを使うのか?

curlを使う主な理由は以下の通りです。

  • 汎用性: 非常に多くのプロトコルに対応しており、様々な種類のデータ転送が可能です。
  • 柔軟性: 数百種類ものオプションがあり、リクエストの挙動を細かく制御できます。ヘッダーの指定、クッキーの管理、認証、プロキシ設定、タイムアウト設定などが自由自在です。
  • スクリプトとの連携: コマンドラインツールであるため、シェルスクリプトや他のプログラミング言語から簡単に呼び出して自動化できます。
  • デバッグと診断: WebサーバーやAPIとの通信問題を診断する際に、Webブラウザよりも詳細な情報(リクエスト/レスポンスヘッダー、接続情報など)を確認できます。
  • 軽量: 余計なGUIを持たないため、サーバーなどのリソースが限られた環境でも動作しやすいです。

1.3 curlのインストール方法

ほとんどのLinuxディストリビューションやmacOSには、デフォルトでcurlがインストールされています。コマンドラインを開いて curl --version と入力し、バージョン情報が表示されればインストール済みです。

bash
curl --version

もしインストールされていない場合や、最新版が必要な場合は、以下の方法でインストールできます。

  • Linux (Debian/Ubuntu):
    bash
    sudo apt update
    sudo apt install curl
  • Linux (Fedora/CentOS/RHEL):
    bash
    sudo dnf install curl # または yum
  • macOS (Homebrew):
    bash
    brew install curl
  • Windows:
    Windows 10以降の多くのバージョンにはデフォルトでcurlが含まれています。含まれていない場合や、古いバージョンのWindowsを使用している場合は、curlの公式サイトからダウンロードしてインストールできます。ダウンロードしたzipファイルを解凍し、実行ファイル(curl.exe)があるディレクトリにパスを通すか、実行ファイルのある場所でコマンドプロンプトやPowerShellを開いて使用します。

インストールが完了したら、再度 curl --version を実行して確認しましょう。

1.4 最初のステップ: curl [URL]

最も基本的なcurlコマンドは、URLを指定してその内容を取得することです。これは主にHTTPまたはHTTPSプロトコルが使われる場合に、指定されたURLのHTMLコンテンツなどを取得します。

bash
curl https://example.com/

このコマンドを実行すると、https://example.com/ のWebサーバーにGETリクエストが送信され、サーバーからの応答(通常はHTMLコンテンツ)が標準出力(ターミナル)に表示されます。

“`html




Example Domain



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.

More information…


“`

これがcurlの最も基本的な使い方です。指定したURLの「何か」を取得して表示する。この「何か」は、HTMLだけでなく、画像ファイル、JSONデータ、XMLデータ、プレーンテキストなど、Webサーバーが提供するあらゆるリソースになり得ます。

1.5 コマンドの構文とオプション

curlコマンドの基本的な構文は以下のようになります。

bash
curl [オプション...] [URL]

[オプション...] の部分で、curlの挙動を制御するための様々なオプションを指定します。オプションはハイフン (-) またはダブルハイフン (--) で始まり、多くの場合、短い形式(例: -o)と長い形式(例: --output)があります。複数のオプションを組み合わせることで、複雑なリクエストやデータ処理が可能になります。

例えば、先ほどの例を少し変えてみます。

bash
curl -i -L https://example.com/

  • -i または --include: レスポンスヘッダーを応答ボディと一緒に出力します。
  • -L または --location: サーバーからリダイレクト(HTTPステータスコード 3xx)を受け取った場合に、その指示に従って新しいURLに再リクエストを行います。

この例では、example.comへのリクエストに対して、もしリダイレクトが発生すればそれに追従し、さらにサーバーからの応答のヘッダー情報も一緒に表示します。

オプションは非常に多いため、すべてを一度に覚える必要はありません。必要な機能に応じてオプションを調べていくのが現実的です。この記事では、特によく使う重要なオプションを中心に解説していきます。

2. HTTP/HTTPSリクエストの詳細

curlが最も頻繁に使われるのは、Webの基盤であるHTTP(Hypertext Transfer Protocol)およびHTTPS(HTTP Secure)プロトコルを介したデータ転送です。ここでは、HTTP/HTTPSリクエストの様々な側面をcurlで制御する方法を詳しく見ていきます。

2.1 GETリクエスト (デフォルト)

URLを指定するだけの基本的なコマンドは、デフォルトでHTTPのGETメソッドを使用します。GETメソッドは、指定したURLのリソースを取得するために使われます。

bash
curl http://httpbin.org/get

http://httpbin.org は、HTTPリクエスト/レスポンスのテストに便利なサイトです。/get エンドポイントは、受け取ったGETリクエストの詳細(ヘッダー、クエリパラメータなど)をJSON形式で返します。

json
{
"args": {},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/7.64.1"
},
"origin": "xx.xx.xx.xx", // あなたのIPアドレス
"url": "http://httpbin.org/get"
}

2.1.1 GETリクエストでファイルとして保存する (-o, -O)

取得したデータを標準出力に表示するのではなく、ファイルとして保存したい場合は -o または -O オプションを使います。

  • -o [ファイル名] または --output [ファイル名]: 指定したファイル名で保存します。
  • -O または --remote-name: リモートのファイル名(URLの最後の部分)を使って保存します。

例: 特定のHTMLファイルをダウンロードして index.html という名前で保存

bash
curl -o index.html https://example.com/

例: リモートのファイル名 image.jpg を使って保存

bash
curl -O https://www.iana.org/_img/2019/iana-logo-header.svg

このコマンドは、iana-logo-header.svg という名前でファイルを現在のディレクトリに保存します。

2.1.2 レスポンスヘッダーを表示する (-I, -i)

サーバーからの応答には、データの本体(ボディ)だけでなく、そのデータに関する情報(Content-Type、Content-Length、キャッシュ設定など)を含む「ヘッダー」が含まれます。

  • -I または --head: リクエストをHEADメソッドとして送信し、応答ボディを含めずにヘッダー情報のみを取得します。これは、リソースの存在確認やヘッダー情報のチェックによく使われます。
  • -i または --include: GETメソッドでリクエストし、応答ボディに加えてレスポンスヘッダーも表示します。

例: example.comのヘッダー情報のみを取得

bash
curl -I https://example.com/

出力例:

HTTP/2 200
Accept-Ranges: bytes
Age: 468387
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Fri, 27 Oct 2023 05:00:00 GMT # 例です
Etag: "3147526947+gzip"
Expires: Fri, 03 Nov 2023 05:00:00 GMT # 例です
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECS (sjc/4E72)
Vary: Accept-Encoding
X-Cache: HIT
Content-Length: 1256

例: example.comのボディとヘッダーの両方を取得

bash
curl -i https://example.com/

出力はヘッダー情報の後に、HTMLボディが続きます。

2.1.3 詳細な通信情報を表示する (-v)

通信の詳細(リクエストヘッダー、レスポンスヘッダー、接続プロセスなど)を確認したい場合は -v (verbose) オプションが非常に役立ちます。デバッグ時に必須と言えるオプションです。

bash
curl -v https://example.com/

出力例(抜粋):

“`
* Trying 93.184.216.34:443…
* Connected to example.com (93.184.216.34) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
* CApath: /etc/ssl/certs
* 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), Change Cipher Spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted h2
* Server certificate:
* subject: C=US; O=Internet Society; CN=example.com
* start date: Oct 26 16:00:00 2022 GMT
* expire date: Oct 25 16:00:00 2023 GMT # 例です
* subjectAltName: host “example.com” matched “example.com”
* issuer: C=US; O=Internet Security Research Group; CN=R3
* SSL certificate verify result: OK (0).
* Using HTTP2, server supports multiplexing
* Connection ID 0: cURL default to host for lambda
* We are not sending a body to be uploaded

GET / HTTP/2 # 送信したリクエストライン
Host: example.com # 送信したヘッダー
user-agent: curl/7.64.1
accept: /

  • Mark bundle as not supporting multiuse
    < HTTP/2 200 # 受信したステータスライン
    < date: Fri, 27 Oct 2023 05:00:00 GMT # 受信したヘッダー
    < expires: Fri, 03 Nov 2023 05:00:00 GMT
    < cache-control: max-age=604800
    < etag: “3147526947+gzip”
    < accept-ranges: bytes
    < content-length: 1256
    < content-type: text/html
  • Connection #0 to host example.com left intact



… (HTML body continues) …
“`

`-v` オプションは、SSL/TLSのネゴシエーション、送信したリクエストヘッダー、受信したレスポンスヘッダーなど、通信に関する詳細なステップを stderr に出力します。これは、特に接続問題やヘッダー関連の問題を診断する際に非常に有効です。

#### 2.1.4 リダイレクトを追跡する (`-L`)

Webサイトにアクセスした際に、異なるURLへ自動的に転送されることを「リダイレクト」と呼びます。これは、URLの変更、一時的なページの移動、HTTPSへの強制など、様々な理由で行われます(HTTPステータスコード 301, 302, 303, 307, 308など)。

デフォルトでは、curlはリダイレクト指示を受け取っても、その指示に従って新しいURLに再リクエストを行いません。リダイレクト先のコンテンツを取得したい場合は、`-L` (location) オプションを指定する必要があります。

例: `http://httpbin.org/redirect/3` は3回リダイレクトします。`-L` なしで実行すると…

“`bash
curl http://httpbin.org/redirect/3
“`

出力例:

“`html


302 Found

Found

The resource was found at /relative-redirect/2;
you should explicitly request it.



“`

302 Found ステータスコードと、リダイレクト先のURLがHTMLに含まれて表示されるだけです。次に `-L` オプションを付けて実行します。

“`bash
curl -L http://httpbin.org/redirect/3
“`

出力例:

“`json
{
“args”: {},
“headers”: {
“Accept”: “*/*”,
“Host”: “httpbin.org”,
“User-Agent”: “curl/7.64.1”
},
“origin”: “xx.xx.xx.xx”,
“url”: “http://httpbin.org/get” // 最終的なリダイレクト先
}
“`

この場合、curlはリダイレクトの指示に自動的に従い、最終的に `/get` エンドポイントから取得した内容が表示されます。リダイレクトの過程を詳しく見たい場合は、`-L` オプションと `-v` オプションを組み合わせて使います。

### 2.2 POSTリクエスト

GETリクエストがリソースの「取得」に使われるのに対し、POSTリクエストはサーバーにデータを「送信」するためによく使われます。Webフォームの送信や、APIへのデータ送信などで利用されます。

curlでPOSTリクエストを送信するには、通常 `-X POST` オプションでメソッドを指定し、`-d` または `-F` オプションで送信するデータを指定します。`-X POST` は必須ではありませんが、明示的に指定することで分かりやすくなります。`-d` や `-F` オプションを使うと、curlは自動的にメソッドをPOSTに設定します。

#### 2.2.1 `-d` または `–data` でボディデータを送信する

`-d` オプションは、リクエストボディとしてデータを送信する際に最も一般的に使われます。通常、`application/x-www-form-urlencoded` または `text/plain` としてデータが送信されます。

例: シンプルなテキストデータをPOSTする

“`bash
curl -X POST -d “key1=value1&key2=value2” http://httpbin.org/post
“`

または `-X POST` を省略してもOKです。

“`bash
curl -d “key1=value1&key2=value2” http://httpbin.org/post
“`

このコマンドは、`key1=value1&key2=value2` という文字列をリクエストボディとして送信します。デフォルトのContent-Typeは `application/x-www-form-urlencoded` になります。

httpbin.orgの`/post`エンドポイントは、受け取ったPOSTリクエストの詳細をJSONで返します。出力例:

“`json
{
“args”: {},
“data”: “key1=value1&key2=value2”, // 送信した生データ
“files”: {},
“form”: { // application/x-www-form-urlencoded としてパースされたデータ
“key1”: “value1”,
“key2”: “value2”
},
“headers”: {
“Accept”: “*/*”,
“Content-Length”: “23”,
“Content-Type”: “application/x-www-form-urlencoded”, // 自動で設定される
“Host”: “httpbin.org”,
“User-Agent”: “curl/7.64.1”
},
“json”: null,
“origin”: “xx.xx.xx.xx”,
“url”: “http://httpbin.org/post”
}
“`

複数の `-d` オプションを指定すると、データが `&` で連結されます。

“`bash
curl -d “key1=value1” -d “key2=value2 with space” http://httpbin.org/post
“`

データがファイルに含まれている場合、ファイル名の前に `@` を付けて指定できます。

“`bash
echo “data_from_file=hello&another=world” > post_data.txt
curl -d @post_data.txt http://httpbin.org/post
“`

#### 2.2.2 `–data-urlencode` でURLエンコードして送信する

`-d` オプションは便利な一方、データ中に `&` や `=` などの特殊文字が含まれる場合に問題が発生することがあります。`–data-urlencode` オプションは、指定したデータを自動的にURLエンコードして送信します。

例: スペースを含むデータを送信

“`bash
curl –data-urlencode “message=hello world” http://httpbin.org/post
“`

これは `message=hello%20world` として送信されます。

ファイルの内容をエンコードして送信する場合も `@ファイル名` 形式を使います。

“`bash
echo “data with & and =” > encoded_data.txt
curl –data-urlencode “payload@encoded_data.txt” http://httpbin.org/post
“`

これは `payload=data%20with%20%26%20and%20%3D` として送信されます。

#### 2.2.3 `-F` または `–form` で multipart/form-data を送信する

Webブラウザでファイルをアップロードする際や、フォームデータを送信する際に使われるのが `multipart/form-data` 形式です。curlでは `-F` または `–form` オプションでこの形式を扱うことができます。

`-F` オプションは `name=value` または `name=@filename` の形式で指定します。

例: 標準的なフォームデータを送信する

“`bash
curl -F “username=testuser” -F “password=secret” http://httpbin.org/post
“`

出力の `form` セクションにデータがパースされていることがわかります。`headers` セクションの `Content-Type` が `multipart/form-data` になっている点も確認しましょう。

例: ファイルをアップロードする

“`bash
echo “This is a test file.” > upload_test.txt
curl -F “file=@upload_test.txt” -F “description=A test file upload.” http://httpbin.org/post
“`

このコマンドは、`upload_test.txt` というファイルを `file` という名前で、`A test file upload.` という説明を `description` という名前で送信します。

出力例(抜粋):

“`json
{
“args”: {},
“data”: “”,
“files”: { // アップロードされたファイルの内容
“file”: “This is a test file.”
},
“form”: { // ファイル以外のフォームデータ
“description”: “A test file upload.”
},
“headers”: {
“Accept”: “*/*”,
“Content-Length”: “xxx”, // ボディサイズ
“Content-Type”: “multipart/form-data; boundary=…”, // Boundaryが付与される
“Host”: “httpbin.org”,
“User-Agent”: “curl/7.64.1”
},
“json”: null,
“origin”: “xx.xx.xx.xx”,
“url”: “http://httpbin.org/post”
}
“`

`-F name=@filename` の形式でファイルを指定すると、curlはファイルの内容を読み込んでボディに含めます。ファイル名だけでなく、MIMEタイプも指定したい場合は `@filename;type=mime/type` の形式を使います。例えば `-F “[email protected];type=image/jpeg”` のようにします。

#### 2.2.4 JSONデータをPOSTする (`-d`, `-H`)

近年のWeb APIでは、JSON形式でデータを送受信するのが一般的です。JSONデータをPOSTするには、`-d` オプションでJSON文字列を指定し、`-H` オプションで `Content-Type: application/json` ヘッダーを明示的に指定します。

例: JSONデータをPOSTする

“`bash
curl -X POST -H “Content-Type: application/json” -d ‘{“name”:”Alice”,”age”:30}’ http://httpbin.org/post
“`

`-X POST` はここでも省略可能ですが、JSON送信の場合は `Content-Type` ヘッダーの指定が必須です。

出力例(抜粋):

“`json
{
“args”: {},
“data”: “{\”name\”:\”Alice\”,\”age\”:30}”, // 生データ(文字列として)
“files”: {},
“form”: {}, // application/x-www-form-urlencoded ではないので空
“headers”: {
“Accept”: “*/*”,
“Content-Length”: “25”,
“Content-Type”: “application/json”, // 指定したヘッダー
“Host”: “httpbin.org”,
“User-Agent”: “curl/7.64.1”
},
“json”: { // application/json としてパースされたデータ
“age”: 30,
“name”: “Alice”
},
“origin”: “xx.xx.xx.xx”,
“url”: “http://httpbin.org/post”
}
“`

JSONデータがファイルに含まれている場合も `@ファイル名` 形式を使えます。

“`bash
echo ‘{“city”:”Tokyo”,”country”:”Japan”}’ > city_data.json
curl -X POST -H “Content-Type: application/json” -d @city_data.json http://httpbin.org/post
“`

### 2.3 他のHTTPメソッド (`-X`)

GETやPOST以外にも、HTTPプロトコルにはPUT, DELETE, HEAD, OPTIONS, PATCHなどのメソッドがあります。これらのメソッドを使いたい場合は、`-X` または `–request` オプションで明示的に指定します。

例: PUTリクエスト(通常はリソースの更新や作成に使われます)

“`bash
curl -X PUT -d ‘{“status”:”active”}’ -H “Content-Type: application/json” http://httpbin.org/put
“`

httpbin.orgの`/put`エンドポイントはPUTリクエストの詳細を返します。

例: DELETEリクエスト(リソースの削除に使われます)

“`bash
curl -X DELETE http://httpbin.org/delete
“`

httpbin.orgの`/delete`エンドポイントはDELETEリクエストの詳細を返します。

例: HEADリクエスト(`-I` オプションと同じですが、`-X HEAD` と明示することも可能です)

“`bash
curl -X HEAD https://example.com/
“`

これは `curl -I https://example.com/` と同じ結果になります。

### 2.4 ヘッダーの指定 (`-H`)

HTTPヘッダーは、リクエストやレスポンスに関する追加情報を提供する重要な要素です。curlでは `-H` または `–header` オプションを使って、カスタムヘッダーを追加したり、デフォルトのヘッダーを変更したりできます。

構文は `-H “Header-Name: Header-Value”` です。複数のヘッダーを指定したい場合は、`-H` オプションを複数回使います。

例: カスタムヘッダー `X-My-Header` を追加する

“`bash
curl -H “X-My-Header: Custom Value” http://httpbin.org/headers
“`

httpbin.orgの`/headers`エンドポイントは、受け取ったリクエストヘッダーをJSONで返します。出力例(抜粋):

“`json
{
“headers”: {
“Accept”: “*/*”,
“Host”: “httpbin.org”,
“User-Agent”: “curl/7.64.1”,
“X-My-Header”: “Custom Value” // 追加したヘッダー
}
}
“`

既存のヘッダー(例: `User-Agent`)を上書きすることも可能です。

“`bash
curl -H “User-Agent: MyCustomClient/1.0” http://httpbin.org/headers
“`

特定のヘッダーを送信しないようにしたい場合は、値としてコロンだけを指定します。

“`bash
curl -H “Accept:” http://httpbin.org/headers
“`

この例では、通常curlが送信する `Accept: */*` ヘッダーが送信されなくなります。

### 2.5 クッキーの送受信 (`-b`, `-c`)

HTTPのクッキー(Cookie)は、サーバーがユーザーのブラウザに保存させる小さなデータ片で、セッション管理やユーザー識別に使われます。curlはクッキーの送受信もサポートしています。

* `-b [ファイル|文字列]` または `–cookie [ファイル|文字列]`: リクエストに含めるクッキーを指定します。ファイル名を指定すると、そのファイルからクッキーを読み込みます。文字列を指定すると、その文字列をクッキーとして送信します(例: `name1=value1; name2=value2`)。Netscape形式のクッキーファイルも読み込めます。
* `-c [ファイル]` または `–cookie-jar [ファイル]`: サーバーから受け取ったクッキーを指定したファイルに保存します。このファイルは、後続のリクエストで `-b` オプションを使って読み込むことができます(Netscape形式で保存されます)。

例: サーバーからクッキーを受け取り、ファイルに保存する

“`bash
curl -c cookies.txt http://httpbin.org/cookies/set?name=testcookie&value=testvalue
“`

このコマンドは、`/cookies/set` から返される `Set-Cookie` ヘッダーに含まれるクッキーを `cookies.txt` ファイルに保存します。`cookies.txt` の中身は以下のようになるはずです。

“`
# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

.httpbin.org TRUE / FALSE 0 name testcookie
“`

例: 保存したクッキーを次のリクエストで送信する

“`bash
curl -b cookies.txt http://httpbin.org/cookies
“`

httpbin.orgの`/cookies`エンドポイントは、受け取ったクッキーをJSONで返します。

“`json
{
“cookies”: {
“name”: “testcookie” // 送信されたクッキーが表示される
}
}
“`

セッションをシミュレートする場合など、連続したリクエストでクッキーを維持したい場合に非常に便利です。

## 3. ファイル転送機能の活用

curlは単にWebページを取得するだけでなく、ファイルのダウンロードやアップロードにも非常に強力なツールです。HTTPだけでなく、FTPやSFTPなどのプロトコルでもファイル転送が可能です。

### 3.1 HTTP/HTTPSでのダウンロードの詳細

前述の `-o` や `-O` オプションを使った基本的なダウンロードに加えて、以下の便利な機能があります。

* **プログレスバーの表示 (`-#`)**: 大きなファイルをダウンロードする際に、進捗状況を `#` の集合で表示します。

“`bash
curl -O -# https://example.com/large_file.zip
“`

* **静音モード (`-s`)**: ダウンロード時のプログレスバーやエラーメッセージなどの出力を抑制し、取得したデータのみを標準出力に表示(またはファイルに保存)します。スクリプトで使う際に便利です。エラーが発生しても何も表示されなくなってしまうため、エラーを表示したい場合は `-S` (show errors) オプションと組み合わせます。

“`bash
curl -s -O https://example.com/file.txt
“`

* **ダウンロードの再開 (`-C -`)**: ネットワーク切断などでダウンロードが中断した場合に、途中から再開できます。既にダウンロード済みのファイルと同じ名前のファイルがローカルに存在する場合に有効です。`-C -` とハイフン一つで指定するのが最も簡単で、curlが自動的に既存ファイルのサイズを判断します。

“`bash
curl -C – -O https://example.com/large_file.zip
“`

### 3.2 HTTP/HTTPSでのアップロード (`-T`)

HTTPのPUTメソッドやPOSTメソッドを使ってファイルをアップロードすることも可能です。

* `-T [ファイル名]` または `–upload-file [ファイル名]`: 指定したファイルをアップロードします。通常、PUTメソッドと組み合わせて使います。

例: `localfile.txt` を `http://example.com/remote/path/remotefile.txt` にアップロードする

“`bash
curl -T localfile.txt http://example.com/remote/path/remotefile.txt
“`

これはPUTリクエストとして送信されます。アップロード先のURLは、サーバー側の設定によってファイル名を含めるか含めないかが異なります。

POSTリクエストの `multipart/form-data` 形式でファイルをアップロードしたい場合は、前述の `-F name=@filename` を使います。

### 3.3 FTP/SFTPでのファイル操作

curlはHTTP/HTTPS以外にもFTP (File Transfer Protocol) やSFTP (SSH File Transfer Protocol) をサポートしています。

FTP/SFTPサーバーへのアクセスは、URLのスキームを `ftp://` または `sftp://` に変更し、認証情報(ユーザー名とパスワード)を `-u` オプションで指定します。

例: FTPサーバーからファイルをダウンロードする

“`bash
curl -u ftpuser:ftppassword ftp://ftp.example.com/path/to/remote_file.txt -O
“`

ユーザー名とパスワードはコロン `:` で区切ります。パスワードを省略すると、curlが対話形式でパスワード入力を求めます。

例: FTPサーバーにファイルをアップロードする

“`bash
curl -u ftpuser:ftppassword -T local_file.txt ftp://ftp.example.com/path/to/remote_directory/
“`

アップロードの場合、FTPサーバーのURLは通常ディレクトリを指定します。ファイル名はローカルファイル名が使われます。

SFTPの場合もほぼ同じ構文です。

例: SFTPサーバーからファイルをダウンロードする

“`bash
curl -u sftpuser:sftppassword sftp://sftp.example.com/path/to/remote_file.txt -O
“`

例: SFTPサーバーにファイルをアップロードする

“`bash
curl -u sftpuser:sftppassword -T local_file.txt sftp://sftp.example.com/path/to/remote_directory/
“`

SFTPはSSHプロトコル上で動作するため、SSH公開鍵認証を利用したい場合は `–pubkey` や `–key` オプションを使って鍵ファイルを指定することも可能です。

例: 公開鍵認証でSFTPダウンロード (秘密鍵ファイル指定)

“`bash
curl –key ~/.ssh/id_rsa sftp://[email protected]/path/to/remote_file.txt -O
“`

## 4. 認証とセキュリティの詳細

Web上の多くのリソースやAPIは、アクセスを許可されたユーザーのみが利用できるように認証が求められます。また、通信のセキュリティ(暗号化や証明書の検証)も非常に重要です。curlはこれらの機能にも対応しています。

### 4.1 認証

curlは様々な認証方式をサポートしています。

#### 4.1.1 基本認証 (Basic Authentication) (`-u`)

最もシンプルな認証方式はHTTP基本認証(Basic Authentication)です。これはユーザー名とパスワードをコロン `:` で区切り、Base64エンコードしてAuthorizationヘッダーに含める方法です。

curlでは `-u` または `–user` オプションを使って簡単に指定できます。

例: ユーザー名 `myuser`、パスワード `mypassword` で認証が必要なURLにアクセス

“`bash
curl -u myuser:mypassword http://example.com/protected/resource
“`

パスワードを省略して `-u myuser:` とすると、curlが実行時にパスワード入力を促します。これにより、パスワードがコマンド履歴に残るのを防ぐことができます。

#### 4.1.2 他の認証方式 (Digest, NTLMなど)

HTTPには基本認証以外にもDigest認証、NTLM認証などがあります。curlはこれらの方式にも対応しており、`-u` オプションと組み合わせて使います。

* `–digest`: Digest認証を使用します。
* `–ntlm`: NTLM認証を使用します。

例: Digest認証でアクセス

“`bash
curl –digest -u myuser:mypassword http://example.com/protected/resource
“`

#### 4.1.3 ベアラー認証 (Bearer Authentication) などヘッダーベースの認証 (`-H`)

OAuth 2.0などで広く使われるベアラー認証(Bearer Authentication)は、APIトークンなどの秘密情報を `Authorization: Bearer [token]` の形式でヘッダーに含める方式です。これは `-H` オプションを使って指定します。

例: `your_api_token` というトークンを使って認証が必要なAPIにアクセス

“`bash
curl -H “Authorization: Bearer your_api_token” https://api.example.com/resource
“`

APIキーをヘッダーに含める場合も同様です。

“`bash
curl -H “X-API-Key: your_api_key” https://api.example.com/resource
“`

### 4.2 SSL/TLSと証明書

HTTPS通信では、SSL/TLSプロトコルを使って通信内容が暗号化されます。また、サーバーの正当性を確認するためにデジタル証明書が使用されます。curlはデフォルトでこれらのセキュリティ機能を有効にしており、証明書が信頼できる認証局(CA)によって署名され、有効期限内で、アクセスしているドメイン名と一致することなどを検証します。

#### 4.2.1 証明書検証の無視 (`-k`, `–insecure`)

自己署名証明書を使っているサイトや、有効期限切れ、ドメイン名不一致などの問題がある証明書を使っているサイトにアクセスしようとすると、curlはデフォルトでエラーを出力して接続を拒否します。

“`bash
curl https://self-signed.example.com/ # エラーになる可能性が高い
“`

エラー例:

“`
curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.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 above URL.
“`

検証エラーを無視して接続を強制したい場合は、`-k` または `–insecure` オプションを使います。

“`bash
curl -k https://self-signed.example.com/
“`

**注意:** `-k` オプションは、中間者攻撃(Man-in-the-middle attack)のリスクを高めます。**本番環境での重要な通信や、信頼できないサイトへのアクセスには絶対に使用しないでください。** デバッグや、信頼できるローカルネットワーク内のテストサーバーなど、リスクを理解した上で一時的に使用する場合に限られます。

#### 4.2.2 CA証明書の指定 (`–cacert`)

デフォルトのCA証明書リストに含まれていないカスタムの認証局によって署名された証明書を信頼させたい場合は、`–cacert` オプションでそのCA証明書ファイル(PEM形式)を指定します。

“`bash
curl –cacert /path/to/my/custom_ca.pem https://internal.example.com/
“`

#### 4.2.3 クライアント証明書認証 (`–cert`, `–key`)

サーバーによっては、ユーザー認証のためにクライアント証明書(相互TLS認証)を要求する場合があります。curlでは、クライアント証明書ファイルと秘密鍵ファイルを指定して、クライアント証明書認証を行うことができます。

* `–cert [証明書ファイル]`
* `–key [秘密鍵ファイル]`

例: クライアント証明書を使ってアクセス

“`bash
curl –cert client.pem –key client.key https://secure-api.example.com/resource
“`

証明書と秘密鍵がパスワードで保護されている場合は、`–cert-type` や `–key-type` オプションでフォーマット(PEM, DER, P12など)を指定したり、`–pass [パスワード]` オプションでパスワードを指定したりすることも可能です。

#### 4.2.4 SNI (Server Name Indication)

SNIは、一つのIPアドレスで複数のSSL証明書を持つサーバー(バーチャルホスト)にアクセスする際に、どの証明書を返すかをサーバーに伝える仕組みです。curlは通常、アクセスするホスト名から自動的にSNIを送信します。特別な設定は必要ありません。

## 5. 高度な機能とカスタマイズ

curlには、より高度なシナリオに対応するための豊富なオプションが用意されています。

### 5.1 プロキシの設定 (`-x`)

ファイアウォールの内側から外部ネットワークにアクセスする場合など、HTTP/HTTPSリクエストをプロキシサーバー経由で送信する必要がある場合があります。

* `-x [プロキシURL]` または `–proxy [プロキシURL]`: 指定したプロキシサーバーを経由してリクエストを送信します。プロキシURLは `[protocol://][user:password@]host[:port]` の形式で指定します。プロトコルを省略すると、デフォルトはHTTPプロキシと見なされます。

例: HTTPプロキシ経由でアクセス

“`bash
curl -x http://proxy.example.com:8080 https://www.google.com/
“`

例: 認証が必要なHTTPプロキシ経由でアクセス

“`bash
curl -x http://user:[email protected]:8080 https://www.google.com/
“`

例: SOCKS5プロキシ経由でアクセス

“`bash
curl -x socks5://socks.example.com:1080 https://www.google.com/
“`

環境変数 `http_proxy`, `https_proxy`, `ftp_proxy`, `all_proxy` などにプロキシ設定をしておくことでも、curlはそれらを自動的に使用します。`-x` オプションは環境変数よりも優先されます。プロキシを使いたくないホストを指定するには `–noproxy` オプションを使います。

### 5.2 タイムアウトの設定 (`–connect-timeout`, `–max-time`)

ネットワークの状態が悪い場合やサーバーの応答が遅い場合に、いつまでも待たずに処理を中断させたいことがあります。タイムアウト関連のオプションがいくつかあります。

* `–connect-timeout [秒]`: TCP接続が確立されるまでの最大待ち時間(秒)を指定します。指定した時間内に接続できない場合、処理は中断されます。
* `–max-time [秒]`: リクエスト全体の最大処理時間(秒)を指定します。これには接続時間、データ転送時間などが含まれます。指定した時間内に処理が完了しない場合、中断されます。

例: 接続タイムアウトを5秒、全体タイムアウトを10秒に設定

“`bash
curl –connect-timeout 5 –max-time 10 http://example.com/slow_resource
“`

これらのオプションは、監視スクリプトなどでサーバーの応答性をチェックする際に非常に重要です。

### 5.3 ユーザーエージェントの偽装 (`-A`)

Webサーバーは、リクエストを送信してきたクライアントの情報をUser-Agentヘッダーで識別することがあります。デフォルトでは、curlは自身のバージョン情報を含むUser-Agentヘッダー(例: `User-Agent: curl/7.64.1`)を送信します。

`-A` または `–user-agent` オプションを使うことで、任意のUser-Agent文字列を送信できます。これは、特定のブラウザからのアクセスをシミュレートしたい場合などに利用できます。

例: ChromeブラウザのUser-Agent文字列を送信する

“`bash
curl -A “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36” http://httpbin.org/headers
“`

httpbin.orgの`/headers`エンドポイントで、送信されたUser-Agentヘッダーを確認できます。

### 5.4 リファラーの指定 (`-e`)

Refererヘッダーは、リクエストがどのページからリンクをたどって来たかを示すために使われます(プライバシー上の理由から省略されることもあります)。curlでは `-e` または `–referer` オプションで任意のRefererヘッダーを指定できます。

例: `http://example.com/previous_page` から来たリクエストをシミュレート

“`bash
curl -e “http://example.com/previous_page” http://httpbin.org/headers
“`

### 5.5 帯域幅の制限 (`–limit-rate`)

ファイルをダウンロードする際に、ネットワーク帯域を使い果たさないように転送速度を制限したい場合があります。`–limit-rate` オプションで最大転送速度を指定できます。速度はバイト単位で、`k` (キロバイト), `M` (メガバイト), `G` (ギガバイト) などの接尾辞も使用できます。

例: ダウンロード速度を100 KB/sに制限

“`bash
curl –limit-rate 100K -O https://example.com/large_file.zip
“`

### 5.6 設定ファイル (`~/.curlrc`) の利用

頻繁に使うオプションやデフォルト設定がある場合は、ユーザーのホームディレクトリに `.curlrc` というファイルを作成して記述しておくことができます。curl実行時にこのファイルが自動的に読み込まれ、記述されたオプションが適用されます。

`.curlrc` ファイルの記述形式は、各行にオプションを一つずつ書くか、長い形式のオプション名に続けて値を書きます。コメントは `#` で始まります。

例: `.curlrc` ファイルの内容

“`ini
# 常にリダイレクトを追跡する
location

# 常にレスポンスヘッダーを含める
include

# User-Agentをカスタマイズする
user-agent = “MyCustomClient/1.0 (.curlrc)”

# デフォルトのプロキシ
proxy = http://myproxy.example.com:8080
“`

この `.curlrc` が存在する場合、`curl https://example.com/` というコマンドは、`curl -L -i -A “MyCustomClient/1.0 (.curlrc)” -x http://myproxy.example.com:8080 https://example.com/` とほぼ同じ意味になります(オプションによっては `.curlrc` での記述方法が異なる場合があります)。

設定ファイルを使うことで、コマンドラインが短くなり、打ち間違いを防ぐことができます。コマンドラインで指定したオプションは、`.curlrc` の設定よりも優先されます。

### 5.7 詳細な情報出力 (`-w`, `–write-out`)

`-w` または `–write-out` オプションは、リクエスト完了後に接続に関する様々な情報をカスタマイズ可能な形式で出力します。これは、APIの応答時間測定や、HTTPステータスコードの取得などに非常に便利です。

`-w` オプションには、出力したい情報を `%` で始まる変数(例: `%{http_code}`, `%{time_total}` など)を使って指定します。改行を入れたい場合は `\n` を使います。

例: HTTPステータスコードと合計処理時間を表示する

“`bash
curl -s -w “HTTP Code: %{http_code}\nTotal Time: %{time_total}s\n” -o /dev/null https://example.com/
“`

* `-s`: 静音モード(通常の出力を抑制)
* `-o /dev/null`: 取得したHTMLボディを `/dev/null` に捨てて表示しない
* `-w “…”`: 指定されたフォーマットで情報を出力

出力例:

“`
HTTP Code: 200
Total Time: 0.123456s
“`

よく使われる変数には以下のようなものがあります。

* `%{http_code}`: HTTPステータスコード
* `%{time_total}`: リクエスト開始から完了までの合計時間(秒)
* `%{time_connect}`: TCP接続確立までの時間(秒)
* `%{time_starttransfer}`: 最初のバイトが転送されるまでの時間(秒)
* `%{speed_download}`: ダウンロード速度(バイト/秒)
* `%{size_download}`: ダウンロードされたサイズ(バイト)
* `%{url_effective}`: リダイレクト後の最終的なURL

これらの変数を組み合わせることで、複雑なパフォーマンス測定や、コマンドの成功/失敗をステータスコードで判断するなどの自動化が可能になります。

## 6. 目的別の使い方 実践レシピ集

curlコマンドの基本的な機能と高度なオプションを理解したところで、具体的な目的に応じた使い方を見ていきましょう。

### 6.1 レシピ 1: Web APIのテストとデバッグ

Web開発において、API(Application Programming Interface)はアプリケーション間連携の核となります。curlはAPIのテストやデバッグに非常に強力です。

#### 6.1.1 特定のURLからJSONデータを取得し、jqで整形

Web APIはしばしばJSON形式でデータを返します。curlで取得したJSONデータを、コマンドラインJSONプロセッサーである `jq` と組み合わせて整形・フィルタリングするのは一般的なテクニックです。

“`bash
curl -s “https://api.github.com/users/octocat” | jq .
“`

* `-s`: プログレスバーなどを非表示にし、JSONデータのみを標準出力に流します。
* `| jq .`: パイプ (`|`) を使ってcurlの出力を `jq .` コマンドに渡します。`jq .` は入力されたJSONを読みやすく整形して出力します。

`jq` がインストールされていない場合は、お使いのOSのパッケージマネージャーでインストールしてください(例: `sudo apt install jq`, `brew install jq`)。

#### 6.1.2 POSTでJSONデータを送信し、応答を確認

前述のJSON POSTの例を、APIテストのシナリオで考えます。

“`bash
curl -X POST -H “Content-Type: application/json” -d ‘{“task”:”Buy milk”,”status”:”pending”}’ https://jsonplaceholder.typicode.com/todos
“`

`https://jsonplaceholder.typicode.com` は、テスト用のダミーAPIを提供しているサイトです。`/todos` エンドポイントにPOSTすると、新しいTodoアイテムが作成されたかのような応答が返されます。

“`json
{
“task”: “Buy milk”,
“status”: “pending”,
“id”: 201 // ダミーで付与されたID
}
“`

この応答を確認することで、APIへのデータ送信が正しく行われたか、期待する応答が得られたかなどをテストできます。

#### 6.1.3 ヘッダーを含めた詳細なリクエスト/レスポンス情報の確認 (`-v`)

APIとの通信で問題が発生した場合、`-v` オプションを使って通信の詳細を確認することがデバッグの第一歩です。どのようなリクエストヘッダーが送信され、サーバーからどのようなステータスコードやヘッダー、エラーメッセージが返ってきたのかを詳細に把握できます。

“`bash
curl -v -H “X-Debug: true” https://api.example.com/resource
“`

この出力を見ながら、ヘッダーが正しく設定されているか、認証情報が送られているか、サーバーが期待するステータスコードを返しているかなどを確認します。

#### 6.1.4 認証(Basic, Bearer)を含むAPIコール

認証が必要なAPIにアクセスする場合も、`-u` または `-H “Authorization:…”` オプションを適切に使います。

例: Basic認証が必要なAPI

“`bash
curl -u apiuser:apipassword https://api.example.com/v1/data
“`

例: Bearerトークン認証が必要なAPI

“`bash
API_TOKEN=”your_actual_token”
curl -H “Authorization: Bearer ${API_TOKEN}” https://api.example.com/v1/data
“`

シェル変数を使うと、コマンド履歴にトークンが直接残るのを避けられます(ただし、`history -d ` などで削除推奨)。より安全な方法としては、設定ファイル `.curlrc` に記述しない、パスワード入力を求める `-u user:` 形式を使う、または環境変数を使うなどがあります。

### 6.2 レシピ 2: Webサイトの診断とデバッグ

curlは、Webサイト自体やWebサーバーの設定に関する情報を収集したり、問題を診断したりするのにも役立ちます。

#### 6.2.1 HTTPヘッダーのみを取得し、サーバー情報やキャッシュ設定を確認 (`-I`)

Webサイトのヘッダーには、使用しているWebサーバーの種類、キャッシュに関する情報(Cache-Control, Expires, Etag)、コンテンツの最終更新日時(Last-Modified)、Set-Cookieヘッダーなどが含まれます。`-I` オプションでこれらを簡単に確認できます。

“`bash
curl -I https://www.google.com/
“`

出力例(抜粋):

“`
HTTP/2 200
date: Fri, 27 Oct 2023 05:00:00 GMT
expires: -1
cache-control: private, max-age=0
content-type: text/html; charset=Shift_JIS
server: gws
x-xss-protection: 0
x-frame-options: SAMEORIGIN
set-cookie: 1P_JAR=…; expires=…; path=/; domain=.google.com; Secure
set-cookie: AEC=…; expires=…; path=/; domain=.google.com; Secure; HttpOnly; SameSite=lax
set-cookie: NID=…; expires=…; path=/; domain=.google.com; HttpOnly
alt-svc: h3=”:443″; ma=2592000,h3-29=”:443″; ma=2592000
“`

これにより、サイトがどのようにキャッシュされているか、どのWebサーバーを使っているか、どのようなセキュリティヘッダーを設定しているかなどを知ることができます。

#### 6.2.2 リダイレクトチェーンを追跡し、最終的なURLを確認 (`-L -v`)

WebサイトのURLが変更されたり、HTTPSに自動的に転送されたりすることはよくあります。`-L` オプションでリダイレクトを追跡できますが、`-v` オプションを組み合わせると、リダイレクトの過程(どのURLからどのURLに、どのようなステータスコードでリダイレクトされたか)を詳細に確認できます。

“`bash
curl -L -v http://httpbin.org/redirect/3
“`

`-v` の出力の中に、`Location:` ヘッダーとその後の再リクエストの様子が記録されます。

#### 6.2.3 ユーザーエージェントを切り替えて応答を確認

一部のWebサイトは、アクセスしてきたUser-Agentによって表示内容を変えることがあります(モバイルサイトへのリダイレクトなど)。`-A` オプションで異なるUser-Agentを試すことで、そのサイトがUser-Agentによって挙動を変えているかどうかを確認できます。

例: iPhoneからのアクセスをシミュレート

“`bash
curl -A “Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1” https://example.com/
“`

#### 6.2.4 応答時間や転送速度を測定 (`-w`)

サイトのパフォーマンスを簡単なレベルで測定したい場合は、`-w` オプションが便利です。

“`bash
curl -s -o /dev/null -w “Connect time: %{time_connect}s, Start transfer time: %{time_starttransfer}s, Total time: %{time_total}s, Download speed: %{speed_download} bytes/s\n” https://example.com/
“`

このコマンドは、接続にかかった時間、最初のデータが届くまでの時間、全体の時間、ダウンロード速度などを表示します。サイトの遅延箇所(接続までか、データ転送開始までかなど)を特定する手がかりになります。

### 6.3 レシピ 3: ファイルの自動ダウンロード/アップロード

スクリプトを使ったバッチ処理などで、定期的なファイル取得やサーバーへのファイル配置が必要になることがあります。

#### 6.3.1 スクリプトでの複数ファイルダウンロード

リストにあるURLからファイルをまとめてダウンロードしたい場合、シェルスクリプトでcurlコマンドをループさせることができます。

“`bash
#!/bin/bash

urls=(
“https://example.com/file1.zip”
“https://example.com/file2.tar.gz”
“https://example.com/file3.pdf”
)

for url in “${urls[@]}”; do
echo “Downloading $url…”
curl -O -L -C – “$url”
if [ $? -eq 0 ]; then
echo “Successfully downloaded $url”
else
echo “Failed to download $url” >&2
fi
done
“`

このスクリプトは、URLのリストをループ処理し、それぞれのファイルを `-O` オプションでダウンロードします。`-L` でリダイレクトを追跡し、`-C -` で中断からの再開を試みます。`$?` でcurlコマンドの終了ステータスを確認し、成功/失敗を判定しています(0は成功)。

#### 6.3.2 ダウンロードの再開を活用

大きなファイルをダウンロードする際、中断しても途中から再開できる `-C -` オプションは非常に重要です。スクリプトに組み込むことで、ネットワークが不安定な環境でも確実にファイルを取得できるようになります。

“`bash
# ダウンロードを実行 (中断される可能性あり)
curl -O -L -C – https://example.com/very_large_file.iso

# 後で再度実行すると、中断したところから再開を試みる
curl -O -L -C – https://example.com/very_large_file.iso
“`

### 6.4 レシピ 4: サーバー/ネットワーク監視

システム管理者は、Webサーバーやアプリケーションが正しく動作しているか監視する必要があります。curlはこのような監視タスクにも利用できます。

#### 6.4.1 HTTPステータスコードのみを取得し、正常性をチェック

Webサーバーが正しく応答しているか(HTTPステータスコードが200番台かなど)をチェックする最も簡単な方法は、ボディを取得せずにステータスコードだけを取得することです。

“`bash
status_code=$(curl -s -o /dev/null -w “%{http_code}” https://example.com/)

if [ “$status_code” -eq 200 ]; then
echo “Website is healthy (Status Code: $status_code)”
else
echo “Website is not healthy (Status Code: $status_code)”
fi
“`

* `-s`: 通常の出力を抑制。
* `-o /dev/null`: 取得したボディを捨てる。
* `-w “%{http_code}”`: ステータスコードのみを標準出力に出力。

これにより、シェルスクリプトなどで定期的に実行し、サーバーの死活監視や簡易的なヘルスチェックを行うことができます。

#### 6.4.2 特定文字列が応答に含まれるかのチェック

WebサイトやAPIの応答内容に特定の文字列(例: “Service Available”, エラーメッセージなど)が含まれているかを確認することで、より詳細な正常性チェックが可能です。curlの出力を `grep` コマンドにパイプします。

“`bash
if curl -s https://example.com/health | grep -q “Status: OK”; then
echo “Service health check OK”
else
echo “Service health check FAILED”
fi
“`

* `-s`: 出力を抑制(`grep` に渡す生データのみ)。
* `grep -q “Status: OK”`: 入力から “Status: OK” という文字列を検索します。`-q` オプションは、マッチしても何も出力せず、終了ステータスのみを返します(0=マッチあり, 1=マッチなし)。

#### 6.4.3 特定ポートへの疎通確認 (簡易版)

curlはHTTP/HTTPS以外のプロトコルもサポートしているため、FTPやTELNETなどを使って特定のポートへの接続性を確認する簡易的な方法としても使えます。

例: TELNETでポート25(SMTP)への接続を試みる(認証などは行わない)

“`bash
curl telnet://mail.example.com:25
“`

接続に成功すれば何も表示されずに終了(またはサーバーからの応答が表示)し、失敗すれば接続エラーが表示されます。これは `telnet` コマンドや `nc` (netcat) コマンドの代替として、curlが使える環境で手軽にポート確認したい場合に便利です。

### 6.5 レシピ 5: その他のプロトコルを使う

前述の通り、curlは多くのプロトコルをサポートしています。

#### 6.5.1 FTPでのディレクトリ一覧取得

FTPサーバーに接続し、特定のディレクトリの内容を一覧表示することも可能です。

“`bash
curl -u ftpuser:ftppassword ftp://ftp.example.com/path/to/directory/
“`

サーバーがディレクトリ一覧を返すように設定されていれば、その内容が標準出力に表示されます。

#### 6.5.2 TFTP (Trivial File Transfer Protocol)

TFTPはUDPベースのシンプルなファイル転送プロトコルで、ネットワークブートなどで使われます。curlはこれもサポートしています。

例: TFTPサーバーからファイルをダウンロード

“`bash
curl tftp://tftp.example.com/path/to/bootfile
“`

例: TFTPサーバーにファイルをアップロード

“`bash
curl -T local_file.bin tftp://tftp.example.com/path/to/upload/remote_file.bin
“`

これらの例は、curlの汎用性の高さを示しています。日常的に使う機会は少ないかもしれませんが、必要なときには非常に役立ちます。

## 7. トラブルシューティングとデバッグ

curlコマンドを実行していて問題が発生することはよくあります。ここでは、一般的な問題とその解決策、デバッグ方法について解説します。

### 7.1 一般的なエラーメッセージ

curlが失敗した場合、エラーメッセージとエラーコード(終了ステータス)が出力されます。よく見るエラーには以下のようなものがあります。

* `curl: (6) Could not resolve host: [hostname]`
* **原因:** 指定したホスト名(ドメイン名)をIPアドレスに解決できません。DNSの問題、ホスト名の入力ミス、ネットワーク接続の問題などが考えられます。
* **対策:** ホスト名が正しいか確認する。ネットワーク接続(特にDNSサーバーの設定)を確認する。`ping [hostname]` や `nslookup [hostname]` でDNS解決ができるか試す。
* `curl: (7) Failed to connect to host port [port]: Connection refused`
* **原因:** 指定したホストのポートへの接続がサーバー側で拒否されました。サーバーが起動していない、ファイアウォールでブロックされている、指定したポートでサービスがLISTENしていない、などの可能性があります。
* **対策:** サーバーが起動しているか確認する。サーバー側やクライアント側のファイアウォール設定を確認する。サーバー側でサービスが指定ポートで待ち受け状態になっているか確認する(例: `netstat -tulnp`)。
* `curl: (35) SSL certificate problem: [error description]`
* **原因:** HTTPS接続時にSSL/TLS証明書の検証に失敗しました。自己署名証明書、有効期限切れ、ホスト名不一致、信頼できない認証局、クライアント側のCA証明書リストが古いなどが考えられます。
* **対策:** 証明書が有効か、アクセスしているホスト名と一致するか確認する。クライアント側のCA証明書リストを更新する。デバッグ目的で一時的に `-k` オプションを使う(非推奨)。信頼できるCAの証明書を使うようにサーバー側を設定する。
* `curl: (28) Operation timed out after [seconds] milliseconds with x of y bytes received`
* **原因:** リクエストが指定された時間内に完了しませんでした。ネットワークの遅延、サーバーの負荷が高い、タイムアウト設定が短すぎるなどが考えられます。
* **対策:** ネットワークの状態を確認する。サーバーの負荷を確認する。必要であれば `–max-time` や `–connect-timeout` オプションでタイムアウト時間を長く設定する。
* `curl: (22) The requested URL returned error: 401 Unauthorized` (または他のHTTPエラーコード)
* **原因:** サーバーがHTTPエラーコードを返しました。401は認証エラー、403はアクセス拒否、404はリソースが見つからない、500はサーバー内部エラーなどです。
* **対策:** URLが正しいか、認証情報(ユーザー名、パスワード、トークンなど)が正しいか確認する。サーバー側のログを確認する。権限設定などを確認する。

### 7.2 `-v` オプションを使ったデバッグ

どんな種類のエラーでも、`-v` (verbose) オプションを付けて実行することは、問題の原因を特定する上で最も有効な手段の一つです。

“`bash
curl -v https://api.example.com/resource # 問題が発生した場合
“`

`-v` の出力には、curlが実行しようとしたステップ(DNS解決、接続、SSL/TLSネゴシエーション)、送信した正確なリクエストヘッダー、サーバーからのレスポンスヘッダー、そしてエラーが発生した場合はそのタイミングなどが詳細に記録されます。例えば、ヘッダーが期待通りに送信されていないことに気づいたり、サーバーが返している正確なエラーメッセージ(HTTPボディに含まれる場合も)を確認したりできます。

### 7.3 HTTPステータスコードの意味

サーバーからの応答に含まれるHTTPステータスコードは、リクエストがどのように処理されたかを示します。主要なコードの意味を理解しておくことは、問題解決に役立ちます。

* **1xx (Informational):** リクエストは受け取られ、処理が続行中。
* **2xx (Success):** リクエストは正常に処理されました。(例: 200 OK, 201 Created, 204 No Content)
* **3xx (Redirection):** リクエストを完了するために追加のアクションが必要です。(例: 301 Moved Permanently, 302 Found, 304 Not Modified)
* **4xx (Client Error):** クライアント側に原因があるエラー。(例: 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 429 Too Many Requests)
* **5xx (Server Error):** サーバー側に原因があるエラー。(例: 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable)

`-I` または `-i` オプション、あるいは `-w “%{http_code}”` オプションを使ってステータスコードを取得し、意味を確認しましょう。

### 7.4 `-s` (silent) モードと `-S` (show errors) モード

通常、curlはダウンロードの進捗状況をプログレスバーで表示したり、エラーメッセージをstderrに出力したりします。

* `-s`: これらの表示を抑制し、静かなモードで実行します。スクリプトでの利用時など、出力が不要な場合に便利です。
* `-S`: `-s` と組み合わせて使われることが多く、静音モードにしつつも、エラーが発生した場合は通常通りエラーメッセージを出力します。これは、スクリプトでエラーだけは確認したい場合に役立ちます。

“`bash
# 成功時は何も表示されない
curl -s -O https://example.com/file.txt

# ファイルが見つからないなど、エラーが発生した場合のみエラーメッセージが表示される
curl -sS -O https://example.com/non_existent_file.txt
“`

エラーハンドリングをスクリプトに組み込む際には、`-sS` と `$?` (終了ステータス) を組み合わせるのが一般的です。

## 8. まとめ

この記事では、curlコマンドの基本的な使い方から、HTTP/HTTPSリクエストの詳細、ファイル転送、認証、セキュリティ、高度な機能、そして目的別の実践的なレシピ、さらにはトラブルシューティングの方法までを網羅的に解説しました。

curlは単なるWebページのダウンロードツールではありません。多様なプロトコルに対応し、数百ものオプションを持つその柔軟性と汎用性は、Web開発、API連携、システム管理、ネットワーク診断、自動化スクリプト作成など、様々な分野で強力な武器となります。

最初はその多くのオプションに圧倒されるかもしれませんが、恐れることはありません。まずは `curl [URL]` から始め、必要に応じて `-O`, `-L`, `-i`, `-v`, `-X`, `-d`, `-H`, `-u`, `-k` といった基本的なオプションを試してみてください。そして、特定の目的(APIテスト、ファイルダウンロードなど)が出てきたら、この記事のレシピ集や公式ドキュメントを参照して、必要なオプションを組み合わせて使ってみてください。

コマンドラインツールであるcurlは、他のコマンド(`grep`, `jq`, `xargs` など)と組み合わせることで、その能力をさらに拡張できます。パイプやリダイレクトを活用し、あなたのワークフローに組み込んでみましょう。

インターネット上のリソースとプログラム的に対話するための強力なツールとして、curlは間違いなくあなたのスキルセットに加えて損はありません。この記事が、あなたがcurlを習得し、日々の作業をより効率的かつ強力に進めるための一助となれば幸いです。

さらに深く学びたい場合は、`man curl` コマンドでローカルのmanページを参照するか、[curlの公式ウェブサイト](https://curl.se/docs/manual.html)にある詳細なマニュアル(英語)を読むことをお勧めします。公式ドキュメントには、この記事では触れきれなかったさらに多くのオプションや詳細な情報が記載されています。

curlを使いこなして、インターネットをより深く理解し、より自由に活用しましょう!

これで記事は終了です。約5000語を目指して執筆しました。各種オプションの説明、具体的なコマンド例、そして目的別の使い方のセクションに多くの言葉を費やしました。読者が基本的な使い方から応用、トラブルシューティングまでを一通り理解できるよう構成しました。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール