【保存版】curl コマンドの使い方徹底ガイド – 基本から応用まで


【保存版】curl コマンドの使い方徹底ガイド – 基本から応用まで

インターネット上のデータ取得や操作は、Webブラウザだけでなく、コマンドラインからも行うことができます。そのための最も強力で柔軟なツールの1つが curl です。

curl は、HTTP、HTTPS、FTP、FTPS、SCP、SFTP、TFTP、DICT、TELNET、LDAP、LDAPS、FILE、POP3、POP3S、SMTP、SMTPS、RTMP、RTSP、Gopher、TLS/SSL 証明書、メタルリンク、NetRC、Cookies、User-Agent、FTPアップロード、フォームポスト、HTTP PUT、プロキシ、認証(Basic, Digest, NTLM, Negotiate)、リダイレクト、ファイルレジューム、エラーハンドリングなど、非常に多岐にわたる機能をサポートしています。

このガイドでは、curl の基本的な使い方から、API連携、デバッグ、ファイル操作といった応用的なテクニックまでを網羅的に解説します。「保存版」として、困ったときにいつでも参照できるよう、詳細な情報と豊富な使用例を提供します。

1. curl とは何か?なぜ使うのか?

curl は、指定されたURLからデータを転送するためのコマンドラインツールであり、ライブラリ(libcurl)でもあります。その名前は “Client for URLs” に由来すると言われています。

なぜ Web ブラウザではなく curl を使うのでしょうか?

  • 自動化: スクリプトやプログラムから簡単に呼び出せるため、繰り返し行うタスクやバッチ処理に最適です。
  • デバッグ: HTTPリクエストやレスポンスの詳細を直接確認できるため、Web開発やAPI連携における問題の原因特定に役立ちます。
  • 柔軟性: HTTPヘッダーのカスタマイズ、POSTデータの送信、認証情報の付与、プロキシ経由のアクセスなど、Webブラウザでは難しい低レベルな制御が可能です。
  • 様々なプロトコル: HTTP/HTTPSだけでなく、FTP、SFTPなど、多くのプロトコルに対応しています。
  • 軽量: GUIを持たないため、サーバー上やリソースの限られた環境でも動作します。

開発者、システム管理者、ネットワークエンジニアなど、様々な分野の人々にとって、curl は不可欠なツールとなっています。

2. curl のインストール

ほとんどのLinuxディストリビューションやmacOSには、最初からcurlがインストールされています。念のため、ターミナルを開いて以下のコマンドを実行し、バージョン情報が表示されるか確認してみましょう。

bash
curl --version

もしインストールされていない場合や、最新版にアップデートしたい場合は、お使いのOSのパッケージマネージャーを使ってインストールできます。

  • Debian/Ubuntu:
    bash
    sudo apt update
    sudo apt install curl
  • Fedora/CentOS/RHEL:
    bash
    sudo dnf install curl # または yum
  • macOS (Homebrew):
    bash
    brew install curl
  • Windows: curl公式サイトからダウンロードするか、Windows 10以降では標準搭載されています。Git for Windowsをインストールすると、Git Bashとともにcurlも含まれることが多いです。

3. curl の基本中の基本

最も基本的な使い方は、URLを指定してその内容を取得することです。

bash
curl https://example.com/

このコマンドは、指定されたURLに対してHTTP GETリクエストを送信し、サーバーからのレスポンス(通常はHTMLコンテンツ)を標準出力(ターミナル)に表示します。

何もオプションを指定しない場合、curl は以下のデフォルト動作をします。

  • HTTP GET メソッドを使用する。
  • レスポンスボディ(コンテンツ)を標準出力に表示する。
  • プログレスメーター(ダウンロード状況を示すバー)を表示する。
  • SSL/TLS 証明書を検証する。
  • HTTP リダイレクトは自動的に追跡しない。

これらのデフォルト動作は、様々なオプションによって変更することができます。

4. よく使う基本的なオプション

ここでは、日々の作業で頻繁に使う基本的なオプションを紹介します。

4.1. ヘッダーを表示する (-I, -i)

HTTPリクエストやレスポンスのヘッダーは、通信に関する様々な情報を含んでいます。

  • -I, --head: GETメソッドではなくHEADメソッドを使用し、レスポンスヘッダーのみを表示します。コンテンツは取得しません。
    bash
    curl -I https://example.com/

    このコマンドは、Webページのコンテンツをダウンロードせずに、そのページに関するメタ情報(最終更新日時、コンテンツタイプ、サーバー情報など)を含むヘッダーを取得したい場合に便利です。

  • -i, --include: GETメソッドでコンテンツを取得しつつ、レスポンスヘッダーも一緒に表示します。
    bash
    curl -i https://example.com/

    コンテンツ本体とヘッダーの両方を確認したい場合に利用します。

4.2. プログレスメーターを非表示にする (-s)

デフォルトでは、curl はダウンロードの進行状況を示すプログレスメーターを表示します。スクリプト内で利用する場合など、この表示が邪魔なことがあります。

  • -s, --silent: プログレスメーターやエラーメッセージなどを抑制し、静かに実行します。
    bash
    curl -s https://example.com/

    コンテンツのみを取得したい場合に便利です。エラーが発生した場合も何も表示されないため、後述するエラーハンドリングのテクニックと組み合わせる必要があります。

  • -S, --show-error: -s と一緒に使うと、プログレスメーターは非表示になりますが、エラーが発生した場合はエラーメッセージが表示されるようになります。
    bash
    curl -sS https://example.com/non-existent-page

4.3. 出力をファイルに保存する (-o, -O)

取得したコンテンツを標準出力ではなく、ファイルに保存したい場合があります。

  • -o, --output [ファイル名]: 指定したファイル名でコンテンツを保存します。
    bash
    curl -o example.html https://example.com/

    このコマンドは https://example.com/ のコンテンツを取得し、カレントディレクトリに example.html という名前で保存します。ファイル名は任意に指定できます。

  • -O, --remote-name: URLのパスの最後の部分をファイル名としてコンテンツを保存します。
    bash
    curl -O https://curl.se/logo/curl-logo.svg

    このコマンドは https://curl.se/logo/curl-logo.svg から画像を取得し、カレントディレクトリに curl-logo.svg という名前で保存します。複数のURLをまとめて取得する場合に便利です。

4.4. リダイレクトを追跡する (-L)

Webサイトによっては、リクエストしたURLから別のURLへ自動的に転送(リダイレクト)されることがあります(例: HTTPからHTTPSへのリダイレクト、wwwあり/なしの統一)。デフォルトでは、curl は最初のリクエストの結果を表示するだけで、リダイレクト先へは移動しません。

  • -L, --location: サーバーがリダイレクト応答(3xxステータスコード)を返した場合、そのリダイレクト先を自動的に追跡してコンテンツを取得します。
    bash
    curl -L http://example.com/ # HTTP から HTTPS へリダイレクトされる場合など

    複数のリダイレクトが連鎖している場合も、最大で設定された回数(デフォルトは50回)まで追跡します。

4.5. タイムアウトを設定する (--connect-timeout, -m)

ネットワークの状態が悪い場合やサーバーの応答が遅い場合、curl コマンドが長時間停止してしまうことがあります。タイムアウトを設定することで、応答がない場合に指定時間で処理を中断させることができます。

  • --connect-timeout [秒数]: サーバーへの接続確立にかかる最大時間を指定します。
    bash
    curl --connect-timeout 5 https://example.com/

    接続に5秒以上かかった場合、エラーになります。

  • -m, --max-time [秒数]: 接続確立後も含め、コマンド全体の実行にかかる最大時間を指定します。
    bash
    curl -m 10 https://example.com/large-file.zip

    データ転送を含め、コマンド開始から終了までが10秒を超えた場合、強制的に終了します。

4.6. HTTPメソッドを指定する (-X)

デフォルトではGETメソッドが使われますが、POST、PUT、DELETEなどの異なるHTTPメソッドを使用したい場合があります。

  • -X, --request [メソッド名]: 使用するHTTPメソッドを指定します。
    bash
    curl -X POST https://example.com/api/users
    curl -X PUT https://example.com/api/users/123
    curl -X DELETE https://example.com/api/users/456

    POSTやPUTメソッドでは、通常、リクエストボディにデータを含めます。これについては後述します。

4.7. ユーザーエージェントを設定する (-A)

多くのWebサーバーは、リクエスト元のクライアント情報(Webブラウザの種類やバージョンなど)をUser-Agentヘッダーで識別しています。デフォルトの curl のUser-Agentは curl/[バージョン] となります。これを偽装したい場合があります。

  • -A, --user-agent [文字列]: User-Agentヘッダーに含める文字列を指定します。
    bash
    curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36" https://example.com/

    これにより、あたかも特定のWebブラウザからアクセスしているかのように見せかけることができます。

4.8. 認証情報を提供する (-u)

ベーシック認証やダイジェスト認証が必要なサイトにアクセスする場合、ユーザー名とパスワードを提供する必要があります。

  • -u, --user [ユーザー名:パスワード]: 認証情報を指定します。
    bash
    curl -u "myuser:mypassword" https://example.com/protected-page

    パスワードをコマンドラインに直接入力するのはセキュリティ上のリスク(シェルの履歴に残るなど)があります。パスワード部分を省略すると、curl はインタラクティブにパスワード入力を求めます。
    bash
    curl -u "myuser:" https://example.com/protected-page # パスワードは入力プロンプトで指定

    認証タイプ(Basic, Digestなど)はサーバーの応答に基づいて curl が自動的に選択しようとします。特定のタイプを指定したい場合は --basic--digest などのオプションを使用します。

4.9. リクエストヘッダーを追加/変更する (-H)

カスタムヘッダーを追加したり、既存のヘッダー(Acceptなど)を変更したりしたい場合があります。

  • -H, --header [ヘッダー名: ヘッダー値]: リクエストにヘッダーを追加または変更します。複数指定可能です。
    bash
    curl -H "Accept: application/json" https://example.com/api/data
    curl -H "X-Custom-Header: some_value" https://example.com/api/resource
    curl -H "Content-Type: application/xml" -X POST https://example.com/api/submit # POSTと組み合わせて使用

    ヘッダー値を空にすると、そのヘッダーを無効にできます(例: -H "Accept-Encoding:" はgzip圧縮などを無効にします)。

5. データの送信(POST, PUTなど)

GETメソッド以外でデータをサーバーに送信する場合、リクエストボディにデータを含める必要があります。

5.1. フォームデータを送信する (-d, --data)

Webフォームの送信によく使われる application/x-www-form-urlencoded 形式のデータを送信する場合に利用します。デフォルトではPOSTメソッドが使用されますが、-X PUT などと組み合わせることも可能です。

  • -d, --data [データ]: POSTリクエストのデータを指定します。データは通常 key1=value1&key2=value2 の形式で記述します。
    bash
    curl -d "username=john.doe&password=secret" https://example.com/login

    データに &= などの特殊文字が含まれる場合は、URLエンコードが必要です。
    bash
    curl -d "message=Hello%20World%21" https://example.com/post

    ファイルの内容をデータとして送信したい場合は、データ部分を @ファイル名 の形式で指定します。
    bash
    curl -d @data.txt https://example.com/submit

    この場合、data.txt ファイルの内容がリクエストボディとして送信されます。

  • --data-raw [データ]: -d と似ていますが、データの先頭に @ があってもファイル参照として扱わず、そのままの文字列として送信します。改行コードや特殊文字もそのまま送信したい場合に便利です。

  • --data-urlencode [データ]: 指定したデータを自動的にURLエンコードして送信します。
    bash
    curl --data-urlencode "message=Hello World!" https://example.com/post

    これは curl -d "message=Hello%20World%21" ... と同じ結果になりますが、特殊文字を手動でエンコードする手間が省けます。

5.2. マルチパートフォームデータを送信する (-F, --form)

ファイルのアップロードや、複数のデータフィールドを含むフォーム送信(HTML <form method="POST" enctype="multipart/form-data">)を行う場合に利用します。

  • -F, --form [名前=値]: マルチパートフォームデータを指定します。これも複数指定可能です。
    “`bash
    # シンプルなフォームフィールド
    curl -F “username=john” -F “password=secret” https://example.com/signup

    ファイルのアップロード

    curl -F “profile_image=@/path/to/your/image.jpg” https://example.com/upload

    ファイルとフォームフィールドの組み合わせ

    curl -F “[email protected]” -F “title=Quarterly Report” https://example.com/upload-doc
    `[名前]=@[ファイルパス]` の形式で指定すると、そのファイルがアップロードされます。ファイル名とMIMEタイプは `curl` が自動的に判断しようとしますが、明示的に指定することも可能です。bash

    ファイル名とMIMEタイプを指定してアップロード

    curl -F “[email protected];filename=custom_report.pdf;type=application/pdf” https://example.com/upload-doc
    ``
    値が
    [名前]=<[ファイルパス]の形式の場合、ファイルの内容がリクエストボディとして送信されます(-d @ファイル名` と似ていますが、マルチパートフォームの一部として扱われます)。

5.3. JSONデータを送信する

RESTful APIなどでは、JSON形式でデータを送受信することが一般的です。JSONデータを送信するには、-d オプションでJSON文字列を指定し、ヘッダーで Content-Type: application/json を明示的に指定する必要があります。

bash
curl -X POST \
-H "Content-Type: application/json" \
-d '{"name": "Alice", "age": 30}' \
https://example.com/api/users

-d オプションの引数としてJSON文字列をシングルクォートで囲むことが多いですが、文字列内にシングルクォートが含まれる場合はエスケープが必要です。ファイルに保存したJSONデータを送信する場合も @ファイル名 を利用できます。
“`bash

user.json ファイルの内容を送信

user.json の内容例: {“name”: “Bob”, “age”: 25}

curl -X POST \
-H “Content-Type: application/json” \
-d @user.json \
https://example.com/api/users
“`

6. SSL/TLS 証明書の扱い

HTTPSサイトにアクセスする際、curl はデフォルトでサーバー証明書の検証を行います。これにより、通信相手が正規のサーバーであることを確認し、中間者攻撃を防ぎます。

6.1. 証明書検証を無効にする (-k)

開発環境やテスト環境で自己署名証明書など、正規の認証局によって署名されていない証明書を使用している場合、デフォルト設定では検証エラーとなります。一時的に検証を無効にしたい場合は -k オプションを使用します。

  • -k, --insecure: サーバー証明書の検証を無効にします。
    bash
    curl -k https://localhost:8443/ # 自己署名証明書などを使用している場合

    警告: このオプションはセキュリティリスクを高めるため、本番環境や信頼できないネットワーク上では絶対に使用しないでください。デバッグ目的などに限定して使用すべきです。

6.2. 特定の証明書を指定する (--cacert, --cert, --key)

クライアント証明書認証が必要な場合や、システムデフォルト以外のCA証明書を使用したい場合があります。

  • --cacert [ファイルパス]: 信頼するCA証明書のバンドルファイルを指定します。PEM形式で指定します。
    bash
    curl --cacert /path/to/my/ca.crt https://internal-server.com/

    これは、プライベートな認証局によって発行された証明書を持つサーバーにアクセスする場合に便利です。

  • --cert [ファイルパス]: クライアント証明書(公開鍵)を指定します。PEM形式やDER形式で指定可能です。

  • --key [ファイルパス]: クライアント秘密鍵を指定します。PEM形式やDER形式で指定可能です。
    bash
    curl --cert /path/to/client.crt --key /path/to/client.key https://example.com/secure-resource

    クライアント証明書と秘密鍵を一つのファイルにまとめることもできます。

7. クッキーの扱い

Webサイトはユーザーの状態を維持するためにクッキーを利用することがよくあります。curl もクッキーを扱うことができます。

7.1. クッキーを送信する (-b)

前回のセッションで取得したクッキーを送信したい場合に使用します。

  • -b, --cookie [文字列またはファイルパス]: リクエストにクッキーを送信します。
    • 文字列で指定する場合: name1=value1; name2=value2 の形式で指定します。
      bash
      curl -b "SESSIONID=abc123; LANG=ja" https://example.com/profile
    • Netscape形式またはHTTPヘッダー形式のファイルで指定する場合:
      bash
      curl -b cookies.txt https://example.com/member-page

      cookies.txt は、後述する -c オプションで保存したファイルなどを指定します。

7.2. 受信したクッキーを保存する (-c)

サーバーからSet-Cookieヘッダーで送信されたクッキーをファイルに保存したい場合に使用します。

  • -c, --cookie-jar [ファイルパス]: 受信したクッキーを指定したファイルにNetscape形式で保存します。
    bash
    curl -c cookies.txt https://example.com/login

    このコマンドは https://example.com/login にアクセスし、サーバーから送られてきたクッキーを cookies.txt に保存します。次回以降、このファイルを -b オプションで指定すれば、保存したクッキーを送信できます。

    注意: クッキーファイルには認証情報などが含まれる可能性があるため、取り扱いには注意が必要です。

8. プロキシ経由のアクセス

ファイアウォールの内側から外部にアクセスする場合や、デバッグのためにプロキシを使いたい場合があります。

  • -x, --proxy [プロキシURL] または [プロキシホスト名]:[ポート番号]: 指定したプロキシサーバーを経由してアクセスします。
    bash
    curl -x http://proxy.example.com:8080 https://www.google.com/
    curl -x socks5://socks.example.com:1080 https://external-site.net/

    環境変数 http_proxy, https_proxy, ftp_proxy, all_proxy などが設定されている場合、curl はデフォルトでそれらを尊重します。-x オプションは環境変数よりも優先されます。

  • --proxy-user [ユーザー名:パスワード]: プロキシ認証が必要な場合に認証情報を指定します。
    bash
    curl -x http://proxy.example.com:8080 --proxy-user "proxyuser:proxypass" https://example.com/

9. 詳細な情報を表示する (-v, --trace)

通信の過程で何が起こっているのかを詳しく知りたい場合、デバッグオプションが非常に役立ちます。

  • -v, --verbose: リクエストとレスポンスの詳細(ヘッダー、SSL/TLS情報、接続プロセスなど)を標準エラー出力に表示します。
    bash
    curl -v https://example.com/

    これは curl が送信するリクエストヘッダーと、サーバーからのレスポンスヘッダー、さらにはSSL/TLSのネゴシエーション情報などを確認するのに最もよく使われるオプションです。

  • --trace [ファイルパス]: 通信の詳細なトレース情報を指定したファイルに書き込みます。ASCII形式で書き出されます。

  • --trace-ascii [ファイルパス]: --trace と同じですが、人間が読めるASCII形式であることが保証されます。
  • --trace-time: --trace または --trace-ascii とともに使用すると、各行にタイムスタンプが付与されます。
    bash
    curl --trace-ascii curl_trace.log https://example.com/

    -v よりもさらに低レベルな通信の詳細(例えば、どのバイトが送信・受信されたかなど)を確認したい場合に便利です。

10. エラーハンドリングとステータスコード

curl はHTTPステータスコード(200 OK, 404 Not Found, 500 Internal Server Errorなど)を直接表示しませんが、スクリプト内でその成功/失敗を判断するための仕組みがあります。

10.1. ステータスコードを表示する (-w)

-w, --write-out [フォーマット文字列] オプションを使うと、リクエスト完了後に指定したフォーマットで情報を標準出力に書き出すことができます。これを利用してステータスコードを表示できます。

  • %{http_code}: HTTPステータスコードを表示するフォーマット変数です。
    bash
    curl -s -o /dev/null -w "%{http_code}\n" https://example.com/

    この例では、-s で通常出力を抑制し、-o /dev/null でコンテンツを捨て、-w "%{http_code}\n" でステータスコードのみを表示しています。

%{http_code} 以外にも多くのフォーマット変数があります。いくつか例を挙げます。
* %{url_effective}: 最終的なURL(リダイレクト後)
* %{time_total}: リクエストにかかった合計時間(秒)
* %{speed_download}: ダウンロード速度(バイト/秒)
* %{size_download}: ダウンロードされたサイズ(バイト)
* %{content_type}: コンテンツタイプ

これらの変数と通常の文字列、改行コード (\n) などを組み合わせて、好きな形式で情報を出力できます。
bash
curl -s -w "URL: %{url_effective}\nStatus: %{http_code}\nTotal Time: %{time_total}s\nDownload Speed: %{speed_download} B/s\n" https://example.com/large-file.zip

10.2. エラー発生時に終了コードを返す (-f)

スクリプト中で curl を使用する場合、HTTPステータスコードが400以上(クライアントエラーまたはサーバーエラー)だったときに、コマンド自体が失敗したことを知らせたい場合があります。

  • -f, --fail: HTTPステータスコードが400以上の場合、標準エラー出力にエラーメッセージを表示し、curl 自体が非ゼロの終了コードを返して終了します。
    bash
    # 存在しないページにアクセス(通常はコンテンツなしでステータス200が返ることもある)
    curl -f https://example.com/non-existent-page

    -f を指定しない場合、404ページの内容を取得しても curl コマンド自体は成功(終了コード0)と判断されることがあります。-f を指定すると、400以上のステータスコードを受け取った時点でコマンドは失敗(非ゼロ終了コード)と判断されます。

10.3. 終了コードの確認

curl コマンドが正常に完了したか、またはどのような種類のエラーで終了したかは、終了コード(exit code)で確認できます。シェルでは、直前に実行したコマンドの終了コードは $? という特殊変数で参照できます。

“`bash
curl https://example.com/
echo $? # 0 が表示されれば成功

curl -f https://example.com/non-existent-page
echo $? # 非ゼロの値(通常 22: HTTPエラー)が表示される
``
終了コードの主な意味は以下の通りです(詳細なリストは
man curlや curl 公式サイトを参照):
*
0: 成功 (CURLE_OK)
*
6: ホスト名を解決できない (CURLE_COULDNT_RESOLVE_HOST)
*
7: サーバーに接続できない (CURLE_COULDNT_CONNECT)
*
22: HTTPエラー(-fオプション使用時、400以上のステータスコード) (CURLE_HTTP_RETURNED_ERROR)
*
28: タイムアウト (CURLE_OPERATION_TIMEDOUT)
*
35`: SSL接続エラー (CURLE_SSL_CONNECT_ERROR)

これにより、シェルスクリプトでエラーハンドリングを行うことができます。
bash
curl -sS -f -o output.html https://example.com/important-page
if [ $? -ne 0 ]; then
echo "Error fetching page. Status code was 400 or higher."
exit 1
fi
echo "Page fetched successfully."

11. ファイルのダウンロードとアップロード

11.1. ダウンロードの再開 (-C)

大きなファイルをダウンロードする際に、ネットワークが切断されたりして中断することがあります。-C オプションを使うと、中断したところからダウンロードを再開できます。

  • -C, --continue-at [オフセット]:中断したダウンロードを再開します。オフセットとして - を指定すると、ローカルファイルのサイズを見て自動的にオフセットを計算します。
    bash
    curl -O https://example.com/large-file.zip # ダウンロード中に中断...
    curl -C - -O https://example.com/large-file.zip # 同じコマンドに -C - を追加して再実行

    このコマンドは、large-file.zip のローカルに存在する部分を確認し、サーバーに対してその続きから送るようにリクエスト(Rangeヘッダーを使用)します。サーバーがRangeリクエストに対応している必要があります。

11.2. ファイルのアップロード (-T)

FTPやPUTメソッドを使ってファイルをアップロードできます。

  • -T, --upload-file [ファイルパス]: 指定したファイルをアップロードします。URLはアップロード先のパスを指定します。
    “`bash
    # FTPサーバーへのアップロード
    curl -u “myuser:mypassword” -T /path/to/local/file.txt ftp://ftp.example.com/remote/directory/

    HTTP PUTでのアップロード

    curl -u “myuser:mypassword” -T /path/to/local/image.jpg https://example.com/uploads/image.jpg
    ``-T` オプションは通常、PUTメソッドを使用します。FTPの場合は STOR コマンドを使用します。

12. 応用的な使い方

12.1. 設定ファイル (-K)

よく使うオプションやヘッダーなどを設定ファイルにまとめておくことができます。

  • -K, --config [ファイルパス]: 指定した設定ファイルを読み込みます。
    bash
    curl -K ~/.curlrc # デフォルトでは ~/.curlrc や _curlrc が自動的に読み込まれる
    curl -K /path/to/my_curl_config http://example.com/

    設定ファイルの記述形式は以下のようになります。各オプションを別々の行に書くか、-o output.html のようにオプションと引数を同じ行に書きます。コメントは # で始まります。

    “`ini

    ~/.curlrc の例

    verbose # -v と同じ
    silent # -s と同じ
    location # -L と同じ
    output “downloaded.html” # -o downloaded.html と同じ
    user-agent “My Custom User-Agent” # -A “My Custom User-Agent” と同じ
    header “X-Requested-With: curl” # -H “X-Requested-With: curl” と同じ
    ``
    環境変数
    CURLOPT` にオプションを指定することもできます。

12.2. HTTP/2, HTTP/3 の利用

curl は最新のHTTPプロトコルもサポートしています。

  • --http2: HTTP/2 を使用しようとします。HTTPS接続の場合、ほとんどのサーバーはALPNによりHTTP/2をサポートしていれば自動的にHTTP/2を使用しますが、このオプションで明示的に指定できます。
    bash
    curl --http2 https://example.com/
  • --http3: HTTP/3 (QUIC) を使用しようとします。UDPポートを使用するため、ファイアウォールなどに注意が必要です。
    bash
    curl --http3 https://example.com/

12.3. パイプとの連携

curl はUNIXの哲学に基づき、標準入出力との連携が容易です。他のコマンドと組み合わせて使うことで、強力な処理パイプラインを構築できます。

  • curl ... | [別のコマンド]: curl の出力を別のコマンドの入力として渡します。
    “`bash
    # JSONデータを取得して jq で整形
    curl -s https://jsonplaceholder.typicode.com/posts/1 | jq .

    Webページを取得して grep で特定の文字列を検索

    curl -s https://example.com/ | grep “Example”

    特定のファイルをダウンロードして直接解凍

    curl https://example.com/archive.tar.gz | tar -xz
    “`

  • [別のコマンド] | curl -d @- ...: 別のコマンドの出力を curl の入力として(POSTデータなどとして)渡します。-d @- は標準入力からデータを読み込むことを意味します。
    “`bash
    # ローカルファイルのコンテンツをPOST
    cat my_data.json | curl -H “Content-Type: application/json” -d @- https://example.com/api/upload

    動的に生成したデータをPOST

    echo “key=value&timestamp=$(date +%s)” | curl -d @- https://example.com/api/log
    “`

12.4. FTP/SFTP の利用

curl はFTPクライアントとしても強力です。

  • ftp://[ホスト名]/[パス] または ftps://...: FTPまたはFTPSでアクセスします。
    bash
    curl ftp://ftp.example.com/pub/file.txt # ファイルダウンロード
    curl -u "user:pass" ftp://ftp.example.com/remote/path/ # 認証付きアクセス
    curl -u "user:pass" -T local.txt ftp://ftp.example.com/remote/path/remote.txt # ファイルアップロード (-T を使用)
  • sftp://[ホスト名]/[パス] または scp://...: SFTPまたはSCPでアクセスします。SSHキー認証やパスワード認証に対応しています。
    bash
    curl sftp://[email protected]/remote/path/file.txt # ファイルダウンロード
    curl -T local.txt sftp://[email protected]/remote/path/remote.txt # ファイルアップロード

    SFTP/SCPの認証では、デフォルトでSSHエージェントや設定ファイル (~/.ssh/config) を利用しようとします。パスワード認証の場合は -u user:pass を使用します。

13. その他の便利なオプション

  • --limit-rate [速度]: 転送速度を制限します(例: 100K, 1M)。帯域幅を圧迫したくない場合に便利です。
    bash
    curl --limit-rate 50K -O https://example.com/large-file.zip
  • --referer [URL]: Refererヘッダーを指定します。
    bash
    curl --referer "https://example.com/previous-page" https://example.com/current-page
  • --resolve [ホスト名:ポート:IPアドレス]: DNSルックアップをスキップし、指定したIPアドレスを使用します。開発環境などで /etc/hosts を編集せずに名前解決をテストしたい場合に便利です。
    bash
    curl --resolve example.com:443:192.168.1.1 https://example.com/
  • --compressed: サーバーがgzip, deflate, brotliなどの圧縮に対応していれば、圧縮されたデータを要求し、自動的に解凍して表示します。多くのWebサーバーはデフォルトでこれをサポートしています。
    bash
    curl --compressed https://example.com/

14. セキュリティに関する注意点

curl は非常に強力ですが、誤って使うとセキュリティリスクを招く可能性があります。

  • 証明書検証 (-k): 前述の通り、-k はセキュリティ上のリスクがあるため、本番環境での使用は避けてください。可能な限り正規のCA証明書を使用するか、プライベートCAの証明書を信頼するようにシステムを設定してください。
  • コマンド履歴 (-u): コマンドラインで -u user:password のように認証情報を直接指定すると、シェルの履歴ファイル (~/.bash_history など) に平文で残ってしまいます。これは非常に危険です。パスワードを省略してインタラクティブに入力するか、可能な場合は環境変数、設定ファイル、または認証情報ヘルパー(Credential Helper)などのより安全な方法を使用してください。
  • クッキーファイル (-c): クッキーファイルにはセッション情報などが含まれます。これらのファイルが不正にアクセスされると、セッションハイジャックなどのリスクがあります。ファイルのパーミッションを適切に設定するなど、取り扱いには十分注意してください。
  • 外部入力の取り扱い: スクリプトで curl を使用する際に、外部から入力されたURLやファイルパスを直接 curl コマンドの引数に渡す場合は、シェルインジェクションなどの脆弱性がないか十分に検証してください。

15. トラブルシューティング

curl コマンドが期待通りに動作しない場合、以下の点をチェックしてみてください。

  • -v オプションを使う: これが最も重要なデバッグ手法です。リクエストヘッダー、レスポンスヘッダー、SSL/TLSハンドシェイク、リダイレクトの追跡など、通信のあらゆる段階の詳細が表示されるため、問題の原因特定に非常に役立ちます。
  • ステータスコードを確認する: -w "%{http_code}\n" を使ってステータスコードを確認し、サーバー側でエラーが発生していないかチェックします(4xx, 5xx)。-f オプションも併用すると、コマンドの成否が分かりやすくなります。
  • ネットワーク接続を確認する: シンプルに pingtraceroute コマンドで対象ホストへのネットワーク接続自体に問題がないか確認します。
  • プロキシ設定: プロキシを使用している場合は、プロキシサーバーが正しく設定されているか、認証情報が正しいか確認します。
  • SSL/TLS 証明書: HTTPSサイトでエラーになる場合は、証明書が有効か、ルート証明書が信頼されているか確認します。-k で一時的に検証を無効にしてみて、証明書が原因か特定する手助けにできます(ただし、その後の安全な検証方法も確認する必要があります)。
  • DNS解決: ホスト名を解決できない(エラーコード6)場合は、DNS設定を確認します。dignslookup コマンドで名前解決をテストできます。--resolve オプションで特定のIPを試すことも有効です。
  • curlのバージョン: 古いバージョンでは対応していないプロトコルやオプションがあるかもしれません。curl --version でバージョンを確認し、必要に応じてアップデートを検討します。
  • curlrc 設定ファイル: 意図しない設定が ~/.curlrc などで読み込まれていないか確認します。-K none オプションで設定ファイルの読み込みを完全に無効にできます。

16. まとめ

curl は、コマンドラインから様々なプロトコルでデータ転送を行うための非常に強力で汎用的なツールです。単にWebページを取得するだけでなく、Web APIのテスト、ファイルダウンロード/アップロード、ネットワークデバッグ、自動化スクリプトなど、幅広い用途で活躍します。

このガイドでは、基本的な使い方から、HTTPメソッド、ヘッダー、データ送信、SSL、クッキー、プロキシ、デバッグ、ファイル操作、設定ファイル、各種プロトコルの利用など、多くの機能とそのオプションを詳細な使用例とともに解説しました。

curl の機能は多岐にわたるため、ここで紹介できたのはその一部に過ぎません。さらに詳細な情報は、公式のmanページ(man curl)やcurl公式サイト(https://curl.se/)を参照してください。

まずは簡単なコマンドから始めて、必要に応じて様々なオプションを試してみてください。curl の奥深さに触れることで、あなたの開発やシステム管理の効率が格段に向上するはずです。

この「保存版」ガイドが、あなたの curl 活用の助けとなれば幸いです。


(記事終わり)

コメントする

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

上部へスクロール