curlコマンド完全ガイド:インストールからオプションまで

はい、承知いたしました。curlコマンドの完全ガイドとして、インストールから様々なオプションまでを詳細に解説する約5000語の記事を記述します。記事の内容を直接表示します。


curlコマンド完全ガイド:インストールからオプションまで

はじめに

インターネット上のリソースとやり取りするための最も強力かつ汎用的なコマンドラインツールの一つが、curlです。ウェブページを取得する、ファイルをダウンロード/アップロードする、APIをテストする、デバッグを行うなど、その用途は多岐にわたります。開発者、システム管理者、さらには一般的なPCユーザーまで、多くの人々にとってcurlは日々の作業に欠かせないツールとなっています。

なぜcurlを学ぶべきなのでしょうか?それは、多くのプロトコル(HTTP, HTTPS, FTP, FTPS, SCP, SFTP, SMB, TELNET, LDAP, DICT, FILE, POP3, IMAP, SMTP, RTMP, RTSP, Gopherなど)をサポートし、豊富なオプションを提供することで、非常に柔軟かつ詳細な制御が可能だからです。Webブラウザや他のGUIツールでは難しい、あるいは不可能な操作も、curlを使えばコマンド一つで実現できることが少なくありません。

この記事は、curlを初めて使う方から、さらに深く使いこなしたいと考えている方までを対象としています。curlのインストール方法から始め、基本的な使い方、そしてHTTPリクエストの詳細な制御、FTPとの連携、その他のプロトコル、さらには高度なテクニックまでを網羅的に解説します。この記事を通じて、curlが提供する広範な機能とその使い方を理解し、日々の作業効率を向上させる一助となることを目指します。

約5000語にわたる詳細な解説を通じて、curlの真価を最大限に引き出すための知識とスキルを習得しましょう。

curlのインストール

ほとんどのモダンなオペレーティングシステムには、すでにcurlがプリインストールされているか、あるいは簡単にインストールできるようになっています。まずは、お使いのシステムにcurlがインストールされているか確認してみましょう。

バージョンの確認

ターミナルまたはコマンドプロンプトを開き、以下のコマンドを実行します。

bash
curl --version

もしcurlがインストールされていれば、バージョン情報とサポートされているプロトコルや機能の一覧が表示されます。

curl 7.64.1 (x86_64-apple-darwin18.7.0) libcurl/7.64.1 OpenSSL/1.1.1d zlib/1.2.11
Release-Date: 2019-12-05
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS GSS-API HTTP2 HTTPS-proxy IPv6 Kerberos Largefile libz NTLM NTLM_WB SPNEGO SSL UnixSockets

上記のようにバージョン情報が表示されれば、インストールは不要です。もし「command not found」のようなエラーが表示される場合は、インストールが必要です。

各OSでのインストール方法

インストール方法は、お使いのオペレーティングシステムによって異なります。

Linux

多くのLinuxディストリビューションでは、パッケージマネージャーを使って簡単にインストールできます。

  • Debian/Ubuntu系:

    bash
    sudo apt update
    sudo apt install curl

  • Fedora/CentOS/RHEL系:

    bash
    sudo dnf install curl # Fedora 22以降
    sudo yum install curl # CentOS/RHEL

  • Arch Linux系:

    bash
    sudo pacman -S curl

インストール後、再度curl --versionを実行して確認してください。

macOS

macOSには通常、curlがプリインストールされています。もし何らかの理由でインストールされていない場合や、最新バージョンを使いたい場合は、Homebrewのようなパッケージマネージャーを使うのが便利です。

“`bash

Homebrewがインストールされていない場合

/bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)”

Homebrewを使ってcurlをインストール/アップグレード

brew install curl
“`

Windows

Windows 10以降の多くのバージョンでは、curl.exeがシステムに同梱されており、コマンドプロンプトやPowerShellから利用できます。

cmd
curl --version

もし同梱されていない場合や、古いバージョンのWindowsを使用している場合は、curlの公式サイトからバイナリをダウンロードしてインストールする必要があります。

  1. curl公式ダウンロードページにアクセスします: https://curl.se/download.html
  2. お使いのWindowsのアーキテクチャ(32-bitまたは64-bit)と、SSLライブラリ(通常はOpenSSL)を含むバージョンを選択します。
  3. zipファイルをダウンロードし、任意のフォルダに展開します。
  4. 展開したフォルダにあるcurl.exeにパスを通すか、curl.exeが置いてあるフォルダ内でコマンドプロンプト/PowerShellを開いて使用します。

パスを通しておくと、どのディレクトリからでもcurlコマンドを実行できるようになり便利です。

インストール後の確認

どの方法でインストールしても、最後にcurl --versionを実行し、正しくインストールされ、コマンドが認識されることを確認しましょう。

これで、curlを使う準備が整いました。次に、基本的な使い方を見ていきます。

curlの基本

curlの最も基本的な使い方は、指定したURLからデータを取得し、標準出力(通常は画面)に表示することです。

最も基本的な使い方

curlの後に取得したいリソースのURLを指定します。

bash
curl https://example.com

このコマンドを実行すると、https://example.comの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…


“`

これはGETリクエストを送信した場合のデフォルトの動作です。

標準出力への表示

デフォルトでは、curlは取得したデータの本体(ボディ)を標準出力に表示します。これはウェブページのHTML、画像ファイルのバイナリデータ、APIからのJSONレスポンスなど、あらゆる種類のデータです。

ファイルへの保存

取得したデータをファイルに保存したい場合は、-oまたは-Oオプションを使用します。

  • -o <出力ファイル名> (小文字オー): 指定したファイル名で保存します。

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

    このコマンドは、https://example.comから取得したHTMLコンテンツをexample.htmlというファイルに保存します。ターミナルには何も表示されません(進行状況表示を有効にしている場合を除く)。

  • -O (大文字オー): URLのパス部分からファイル名を推測して保存します。複数のURLを指定した場合に便利です。

    bash
    curl -O https://example.com/images/logo.png

    このコマンドは、https://example.com/images/logo.pngから画像ファイルをダウンロードし、logo.pngという名前でカレントディレクトリに保存します。

    複数のファイルをダウンロードする場合:

    bash
    curl -O https://example.com/file1.txt -O https://example.com/file2.txt

    これでfile1.txtfile2.txtがダウンロードされます。

プロトコル

curlは様々なプロトコルをサポートしています。URLのスキーム部分(http://, https://, ftp://など)を指定することで、使用するプロトコルが決定されます。

  • HTTP/HTTPS: ウェブコンテンツの取得やAPI操作に最もよく使われます。

    bash
    curl http://httpbin.org/get # HTTP
    curl https://api.github.com/users/octocat # HTTPS

  • FTP/FTPS: ファイル転送プロトコルです。ファイルのダウンロードやアップロードに使用します。

    bash
    curl ftp://ftp.example.com/pub/file.zip # ダウンロード

    ログインが必要な場合は、-uオプションでユーザー名とパスワードを指定します(後述)。

  • FILE: ローカルファイルシステム上のファイルを取得します。

    bash
    curl file:///path/to/local/file.txt

    これはローカルファイルの内容を標準出力に表示します。

curl --versionで表示されるProtocols:の項目で、サポートされているプロトコルの一覧を確認できます。

複数のURLを扱う

curlは一度に複数のURLを指定してリクエストを実行できます。通常はそれぞれのURLに対して順番にリクエストが実行されます。

bash
curl https://example.com https://www.iana.org

このコマンドはまずhttps://example.comのコンテンツを表示し、次にhttps://www.iana.orgのコンテンツを表示します。

ファイルに保存する場合は、-Oオプションと組み合わせるのが一般的です。

bash
curl -O https://example.com/index.html -O https://www.iana.org/index.html

これはexample.comindex.htmliana.orgindex.htmlをそれぞれダウンロードして保存します。

進行状況表示

デフォルトでは、curlはダウンロードの進行状況を示すプログレスバーを表示します。

% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1256 100 1256 0 0 2802 0 --:--:-- --:--:-- --:--:-- 2808

この表示は、ダウンロードサイズ、受信済みサイズ、転送速度、残り時間などをリアルタイムで示します。

  • -s (または--silent): プログレスバーやエラーメッセージなど、余分な情報を表示せず、純粋にデータ本体のみを出力します。スクリプトなどで出力をパースする場合によく使われます。

    bash
    curl -s https://example.com

  • -# (または--progress-bar): よりシンプルで視覚的なプログレスバーを表示します。特に小さなファイルや短い接続で便利です。

    bash
    curl -# -O https://www.iana.org/assignments/media-types/media-types.xml

エラーハンドリング

curlはリクエストの失敗やエラーが発生した場合、通常はエラーメッセージを標準エラー出力に表示し、0以外の終了コードを返します。シェルスクリプトなどでcurlの結果を判定する際に、この終了コードを確認することができます。

bash
if curl -s -o /dev/null https://nonexistent.example.com; then
echo "Success"
else
echo "Failed (exit code: $?)"
fi

$?は直前に実行されたコマンドの終了コードです。curlの終了コードの意味については、man curlで検索できるEXIT CODESセクションを参照してください。

基本的なcurlの使い方は以上です。ここから、より詳細な制御方法、特にHTTPリクエストに関するオプションについて掘り下げていきます。

HTTPリクエストの詳細

curlが最も頻繁に使用されるのは、おそらくHTTPまたはHTTPSプロトコルを介したWebリソースとのやり取りでしょう。Web APIとの連携、ウェブサイトのデバッグ、自動化スクリプトなど、HTTPリクエストの様々な側面をcurlで制御できます。

HTTPメソッドの指定 (-X)

HTTPプロトコルでは、リソースに対してどのような操作を行いたいかをメソッドで指定します。一般的なメソッドにはGET, POST, PUT, DELETE, HEADなどがあります。curlはデフォルトでGETメソッドを使用しますが、-Xオプションを使って他のメソッドを指定できます。

“`bash

デフォルト (GET)

curl https://httpbin.org/get

GETを明示的に指定

curl -X GET https://httpbin.org/get

POSTメソッドでリクエストを送信

curl -X POST https://httpbin.org/post

PUTメソッドでリクエストを送信

curl -X PUT https://httpbin.org/put

DELETEメソッドでリクエストを送信

curl -X DELETE https://httpbin.org/delete

HEADメソッドでリクエストを送信 (ヘッダーのみ取得)

curl -X HEAD https://httpbin.org/head
“`

HEADメソッドは、リクエストのボディを取得せずにヘッダー情報のみを取得したい場合に便利です。たとえば、ファイルサイズや最終更新日時を確認するのに使えます。

bash
curl -I https://example.com # -Iは-X HEADと同じ

-Iオプションは、-X HEADに加えてレスポンスヘッダーを必ず表示するという意味合いがあります。

ヘッダーの操作

HTTPヘッダーは、リクエストやレスポンスに関する付加情報(コンテンツタイプ、クッキー、認証情報など)を伝えるために使用されます。curlでは、リクエストヘッダーを追加したり、レスポンスヘッダーを表示したりできます。

  • カスタムヘッダーの追加 (-H): -H '<Header-Name>: <Header-Value>'の形式で指定します。複数のヘッダーを追加する場合は、-Hオプションを複数回使用します。

    bash
    curl -H 'User-Agent: My-Curl-Client/1.0' \
    -H 'X-Custom-Header: CustomValue' \
    https://httpbin.org/headers

    httpbin.org/headersは、受け取ったリクエストヘッダーをJSON形式で返すテストサイトです。上記のコマンドを実行すると、追加したヘッダーが含まれていることが確認できます。

    よく使われるヘッダーの例:
    * User-Agent: リクエストを送信しているクライアントの情報。
    * Content-Type: リクエストボディのデータの形式(例: application/json, application/x-www-form-urlencoded)。
    * Accept: クライアントが受け入れ可能なレスポンスの形式(例: application/json, text/html)。
    * Authorization: 認証情報(例: Basic base64encodedstring, Bearer token)。
    * Referer: リクエスト元のURL。
    * Cookie: サーバーに送信するクッキー情報。

  • レスポンスヘッダーの表示 (-i, -I):

    • -i (または--include): レスポンスボディに加えて、レスポンスヘッダーも表示します。
      bash
      curl -i https://example.com

      これにより、HTTPステータスコード、Content-Type, Content-Length, Dateなどのレスポンスヘッダーが表示された後に、HTMLボディが表示されます。
    • -I (または--head): -X HEADリクエストを送信し、レスポンスヘッダーのみを表示します。前述の通りです。
      bash
      curl -I https://example.com

リクエストボディの送信 (POST, PUTなど)

POSTやPUTリクエストでは、リクエストボディにデータを含めて送信するのが一般的です。curlでは様々な方法でボディデータを指定できます。

  • -d <データ> (または--data): POSTまたはPUTリクエストでデータを送信します。デフォルトではContent-Type: application/x-www-form-urlencodedとして扱われます。データはURLエンコードされます。

    bash
    curl -d 'param1=value1&param2=value2' https://httpbin.org/post

    ファイルからデータを読み込んで送信することもできます。ファイル名の前に@を付けます。

    bash
    curl -d @data.txt https://httpbin.org/post

    data.txtの内容がリクエストボディとして送信されます。

  • --data-raw <データ>: -dと同様ですが、データはURLエンコードされません。すでにエンコードされているデータや、特定の形式のデータをそのまま送信したい場合に便利です。

    bash
    curl --data-raw '{"key":"value with spaces"}' https://httpbin.org/post

  • --data-urlencode <データ>: 指定したデータをURLエンコードしてから送信します。例えば、param=value with spacesのようなデータで、値に空白などが含まれる場合に便利です。

    bash
    curl --data-urlencode 'param1=value with spaces&param2=another value' https://httpbin.org/post

  • --data-binary <データ>: バイナリデータを送信します。これも@記号を使ってファイルから読み込むことが多いです。例えば、画像ファイルや圧縮ファイルなどをアップロードする場合に使えます。

    bash
    curl --data-binary @image.png https://httpbin.org/post

    この場合、適切なContent-Typeヘッダーを別途指定する必要があるかもしれません (-H 'Content-Type: image/png')。

JSONデータの送信

APIとの連携ではJSON形式のデータをボディに含めて送信することが非常に多いです。

JSONデータを送信するには、通常-dまたは--data-rawオプションと-H 'Content-Type: application/json'ヘッダーを組み合わせて使用します。

bash
curl -X POST \
-H 'Content-Type: application/json' \
-d '{"name": "Alice", "age": 30}' \
https://httpbin.org/post

ファイルに保存したJSONデータを送信することも可能です。

“`bash

data.json の内容: {“name”: “Bob”, “city”: “London”}

curl -X POST \
-H ‘Content-Type: application/json’ \
-d @data.json \
https://httpbin.org/post
“`

フォームデータの送信 (-F)

WebページのHTMLフォームからファイルをアップロードしたり、キー/バリュー形式のデータを送信したりする場合、通常はmultipart/form-dataエンコーディングが使用されます。curlでは-Fオプションでこれを簡単に行えます。

-F '<name>=<value>'の形式で指定します。

bash
curl -F 'username=john_doe' \
-F 'password=secret' \
https://httpbin.org/post

ファイルをアップロードする場合は、値の前に@記号を付けます。

bash
curl -F 'profile_picture=@/path/to/image.jpg' \
-F 'description=My profile image' \
https://httpbin.org/post

複数のファイルを同じフォームフィールド名でアップロードする場合は、-F 'name=@file1' -F 'name=@file2'のように複数指定します。

-Fオプションは、自動的にリクエストメソッドをPOSTに設定し、Content-Typeヘッtダーをmultipart/form-dataに設定します。

リダイレクトの追跡 (-L)

HTTPレスポンスには、リクエストされたリソースが別の場所にあることを示すリダイレクト(3xxステータスコード)が含まれることがあります。デフォルトでは、curlはリダイレクトに従いません。リダイレクト先に自動的に移動して最終的なリソースを取得したい場合は、-Lオプションを使用します。

bash
curl http://httpbin.org/redirect/3 # /redirect/3は3回リダイレクトするエンドポイント

このコマンドを実行すると、curlは最初のレスポンスでリダイレクトを受け取っても、追跡せずに終了します。

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

-Lオプションを付けて実行すると、curlはリダイレクトを自動的に追跡し、最終的にリダイレクト先のコンテンツを表示します。デフォルトでは最大5回のリダイレクトを追跡します。--max-redirs <回数>で上限を変更できます。

クッキーの送受信

HTTPクッキーは、サーバーがクライアント(ブラウザやcurlなど)に送信し、クライアントが以降のリクエストでサーバーに送り返す小さなデータ片です。セッション管理などで使用されます。

  • クッキーの送信 (-b): リクエストに含めるクッキーを指定します。

    • 文字列で指定する場合: -b 'name1=value1; name2=value2'
      bash
      curl -b 'sessionid=abcdef123456' https://example.com/profile
    • ファイルから読み込む場合(Netscape formatまたはHTTPヘッダー形式): -b <ファイル名>
      bash
      # ブラウザや他のツールで保存したクッキーファイルを指定
      curl -b cookies.txt https://example.com/profile
  • 受信したクッキーの保存 (-c): サーバーから受け取ったクッキーを指定したファイルに保存します。通常はNetscape cookie file formatで保存されます。

    “`bash
    curl -c cookies.txt https://example.com/login

    次回のリクエストで保存したクッキーを使用

    curl -b cookies.txt https://example.com/profile
    “`
    ログイン後に受け取ったセッションクッキーを保存し、その後の認証が必要なリクエストで使用する、といったシナリオで便利です。

認証 (-u)

HTTP認証が必要なリソースにアクセスする場合、-uオプションでユーザー名とパスワードを指定できます。形式は-u 'user:password'です。

bash
curl -u 'myuser:mypassword' https://example.com/protected

デフォルトでは、Basic認証が試みられます。これはユーザー名とパスワードをbase64エンコードしてヘッダーに含める方式で、セキュリティは高くありません(HTTPSと併用しない限り)。

Digest認証など、より安全な認証方式が必要な場合は、--digestオプションを追加します。

bash
curl --digest -u 'myuser:mypassword' https://example.com/protected

-uオプションでパスワードを省略した場合、curlはインタラクティブに入力を求めます。これはパスワードがコマンド履歴に残るのを防ぐのに役立ちます。

bash
curl -u 'myuser:' https://example.com/protected

HTTPS/SSL/TLS

curlはHTTPSを完全にサポートしており、SSL/TLS証明書の検証をデフォルトで行います。これは通信のセキュリティを確保するために非常に重要です。

  • 証明書の検証: curlはシステムの証明書ストアや指定されたCA証明書ファイルを使って、サーバーから提示された証明書が信頼できる認証局によって署名されているか、ホスト名が一致するかなどを確認します。検証に失敗すると、接続を拒否します。

  • 検証を無効にする (-k): 非推奨です! デバッグ目的などで、証明書の検証を無効にしたい場合は-k (または--insecure) オプションを使用します。これを使うと、中間者攻撃に対して無防備になるため、本番環境や信頼できないネットワークでは絶対に使用しないでください。

    “`bash

    非推奨! 証明書検証を無視して接続

    curl -k https://untrusted-site.com
    “`

  • CA証明書の指定 (--cacert): システムのデフォルトCA証明書以外の証明書を使用したい場合や、自己署名証明書を検証したい場合などに、CA証明書ファイルを指定します。

    bash
    curl --cacert /path/to/my/custom_ca.crt https://internal-server.com

  • クライアント証明書 (--cert, --key): サーバーがクライアント証明書を要求する場合、クライアント証明書ファイルと秘密鍵ファイルを指定します。

    bash
    curl --cert /path/to/client.crt --key /path/to/client.key https://secure-server.com

    証明書ファイルと秘密鍵ファイルがパスワードで保護されている場合、--cert-type--key-type--passなどのオプションが必要になることがあります。

HTTPバージョン

curlはHTTP/1.0、HTTP/1.1、HTTP/2などのバージョンをサポートしています。デフォルトでは、接続先のサーバーがサポートしている最も新しいバージョンをネゴシエートして使用しようとします。

  • HTTP/1.0を強制 (--http1.0):

    bash
    curl --http1.0 https://example.com

  • HTTP/1.1を強制 (--http1.1):

    bash
    curl --http1.1 https://example.com

  • HTTP/2を強制 (--http2):

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

    HTTP/2は通常、HTTPSと組み合わせて使用されます。curl --versionの出力にFeatures: ... HTTP2 ...と表示されていればサポートされています。

FTPとの連携

curlはHTTP以外にも、FTP (File Transfer Protocol) を使ったファイル転送をサポートしています。ファイルのダウンロードやアップロードが可能です。

FTPでのダウンロード

FTPサーバーからファイルをダウンロードするには、URLにftp://スキームを使用します。

bash
curl ftp://ftp.example.com/path/to/file.zip

これもデフォルトでは標準出力にファイル内容が表示されます。ファイルとして保存するには-oまたは-Oオプションを使用します。

bash
curl -O ftp://ftp.example.com/pub/README

FTPでのアップロード (-T)

ローカルにあるファイルをFTPサーバーにアップロードするには、-Tオプションを使用します。引数としてアップロードしたいローカルファイル名を指定し、宛先URLにアップロード先のパスを指定します。

bash
curl -T /path/to/local/file.txt ftp://ftp.example.com/pub/uploaded_file.txt

これは/path/to/local/file.txtをFTPサーバーの/pub/uploaded_file.txtとしてアップロードします。

FTPでのログイン (-u)

多くのFTPサーバーでは匿名アクセスが許可されていますが、認証が必要な場合もあります。HTTPと同様に、-u 'user:password'形式でログイン情報を指定できます。

bash
curl -u 'myuser:mypassword' ftp://ftp.example.com/protected/file.tar.gz

アップロードの場合も同様です。

bash
curl -u 'myuser:mypassword' -T /path/to/local/file.txt ftp://ftp.example.com/incoming/file.txt

FTP関連のその他のオプション

  • -P <ポート> (または--ftp-port): FTP接続に使用するポートを指定します。ftp://hostname:port/...のようにURLで指定することもできます。
    bash
    curl -P 2121 ftp://ftp.example.com/file.txt

    または
    bash
    curl ftp://ftp.example.com:2121/file.txt

  • --ftp-create-dirs: アップロード先のディレクトリが存在しない場合に、ディレクトリを作成するように試みます。

    bash
    curl --ftp-create-dirs -T mydata.txt ftp://ftp.example.com/new/dir/mydata.txt

  • --disable-epsv: PASVモードの代わりにPORTモードを使用します。一部のNAT環境やファイアウォールで問題が発生する場合に役立つことがあります。

その他のプロトコルと機能

curlはHTTP/HTTPSやFTP以外にも、多くのプロトコルをサポートしています。また、ネットワーク接続や転送に関する様々な設定を行うためのオプションも提供しています。

SCP/SFTP (SSH経由)

curlはSCP (Secure CoPy) やSFTP (SSH File Transfer Protocol) を使ったSSH経由でのファイル転送もサポートしています。

  • SCPでのダウンロード:

    bash
    curl scp://[email protected]/path/to/remote/file.txt

    パスワードが必要な場合は、-u 'user:password'形式で指定します。パスワードを省略するとインタラクティブに入力を求められます。

  • SFTPでのダウンロード:

    bash
    curl sftp://[email protected]/path/to/remote/file.txt

  • SCP/SFTPでのアップロード (-T):

    bash
    curl -T /path/to/local/file.txt scp://[email protected]/path/to/remote/destination.txt
    curl -T /path/to/local/file.txt sftp://[email protected]/path/to/remote/destination.txt

SSH接続の場合、curlはデフォルトでSSHエージェントや~/.ssh/config設定を利用して認証を試みます。パスワード認証を使う場合は-uオプションが必要です。

ファイルURL (file://)

前述しましたが、ローカルファイルシステム上のファイルにアクセスするのにfile://スキームを使えます。

bash
curl file:///etc/passwd

これは/etc/passwdファイルの内容を標準出力に表示します。Windowsではfile:///C:/path/to/file.txtのように指定します。

プロキシ設定 (-x)

ファイアウォールやネットワーク構成によっては、HTTP/HTTPSリクエストをプロキシサーバー経由で行う必要がある場合があります。-xオプションでプロキシを設定できます。形式は-x <protocol://[user:password@]host[:port]>です。

“`bash

HTTPプロキシ経由でHTTPSサイトにアクセス

curl -x http://proxy.example.com:8080 https://example.com

認証付きプロキシ

curl -x http://user:[email protected]:8080 https://example.com

SOCKS5プロキシ

curl -x socks5://localhost:1080 http://example.com
“`

環境変数http_proxy, https_proxy, ftp_proxy, all_proxy, no_proxyを設定することでもプロキシを指定できます。-xオプションは環境変数よりも優先されます。

タイムアウト設定

ネットワークの状態によっては、接続が確立できなかったり、データの転送が途中で停止したりすることがあります。タイムアウトを設定することで、無応答なサーバーに対して長時間待ち続けるのを防ぎます。

  • 接続タイムアウト (--connect-timeout <秒>): サーバーとのTCP接続を確立するまでの最大時間を秒単位で指定します。

    “`bash

    接続確立に5秒以上かかったらタイムアウト

    curl –connect-timeout 5 http://slow-server.example.com
    “`

  • 最大許容時間 (--max-time <秒>): リクエスト全体(接続、データ転送完了まで)の最大許容時間を秒単位で指定します。

    “`bash

    リクエスト開始から終了まで全体で10秒以上かかったらタイムアウト

    curl –max-time 10 http://example.com/large-file.zip
    “`

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

  • 詳細な情報表示 (-v): リクエストとレスポンスの詳細な情報(接続情報、送信ヘッダー、受信ヘッダーなど)を表示します。デバッグに非常に役立ちます。

    bash
    curl -v https://example.com

    出力には、接続先IPアドレス、ポート、SSL/TLSハンドシェイクの詳細、送信されたヘッダー、受信したヘッダーなどが含まれます。

  • 出力形式の指定 (-w): リクエスト完了後に、指定した書式で情報を出力します。APIのレスポンスタイムなどを計測するのに便利です。書式文字列には様々な変数(例: %\{http_code}, %\{time_total}, %\{url_effective}など)を使用できます。

    “`bash

    HTTPステータスコードと合計所要時間を表示

    curl -s -w “HTTP Code: %{http_code}\nTotal Time: %{time_total}s\n” -o /dev/null https://example.com
    ``-sオプションで通常出力を抑制し、-o /dev/null`でボディを破棄することで、書式指定した情報のみを出力しています。

  • 再試行 (--retry <回数>): エラーが発生した場合に、指定した回数だけリクエストを再試行します。ネットワークが不安定な場合に便利です。

    “`bash

    最大3回まで再試行(最初は待機時間なし、その後指数関数的に増加)

    curl –retry 3 http://example.com/flaky-resource
    ``–retry-delay <秒>で最初の再試行までの待機時間を指定したり、–retry-max-time <秒>`で再試行全体にかける最大時間を指定したりすることもできます。

  • 帯域制限 (--limit-rate <速度>): データ転送速度を制限します。キロバイト(k), メガバイト(m), ギガバイト(g)単位で指定できます。

    “`bash

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

    curl –limit-rate 100k -O https://example.com/large-file.zip
    “`

  • ユーザーエージェントの指定 (-A): -H 'User-Agent: ...'のショートカットです。

    bash
    curl -A 'Mozilla/5.0' https://example.com

  • 参照元URLの指定 (--referer): -H 'Referer: ...'のショートカットです。

    bash
    curl --referer 'https://example.com/login' https://example.com/protected-page

高度な使い方とテクニック

基本的なオプションに加えて、curlにはより高度なシナリオに対応するための機能や、便利な使い方があります。

複数のリクエストをまとめて実行

curlはコマンドラインで複数のURLを指定するだけでなく、設定ファイルを使ったり、特定の構文を使ったりして複数の転送をまとめて実行できます。

  • ブレース展開 ({}): URLの一部を{}で囲み、カンマ区切りのリストや範囲を指定することで、複数のURLを生成してリクエストできます。

    “`bash

    file1.txt と file2.txt をダウンロード

    curl -O http://example.com/file{1,2}.txt

    image001.png から image010.png をダウンロード

    curl -O http://example.com/images/image[001-010].png

    imagea.jpeg, imageb.jpeg, imagec.jpeg をダウンロード

    curl -O http://example.com/images/image{a,b,c}.jpeg
    ``
    数値範囲は
    [start-end]形式、文字範囲は[a-z][A-Z]形式で指定できます。必要に応じてゼロパディングを指定することも可能です(例:[01-10]01から10`)。

  • シーケンス ([]): 数値や文字のシーケンスを生成します。

    “`bash

    page1.html, page2.html, …, page5.html をダウンロード

    curl -O http://example.com/page[1-5].html
    “`

デバッグオプション (-v) の活用

-vオプションは非常に強力なデバッグツールです。以下のような情報が得られます。

  • 名前解決: ホスト名がどのIPアドレスに解決されたか。
  • 接続: どのIPアドレスとポートに接続しようとしているか。TCP接続が確立できたか。
  • SSL/TLSハンドシェイク: SSL/TLSセッションの確立状況、使用されたプロトコルバージョン、暗号スイート、証明書チェーンなど。
  • リクエストヘッダー: curlが実際にサーバーに送信するすべてのHTTPヘッダー(User-Agent, Host, Acceptなど、自分で指定したものを含む)。
  • レスポンスヘッダー: サーバーから返されるすべてのHTTPヘッダー(Status Code, Content-Type, Set-Cookie, Locationなど)。
  • データ転送: 送受信されるデータの簡単な表示(バイナリデータの場合は表示されないか、エスケープされる)。

トラブルシューティングの際には、まず-vオプションを付けてリクエストを実行してみるのがおすすめです。

設定ファイルの使用 (-K)

頻繁に使用するオプションや、複雑なオプションの組み合わせがある場合、それらをファイルにまとめておき、-Kオプションで読み込むことができます。設定ファイルは#で始まるコメント行をサポートし、オプションを1行に1つ記述します。

例: curlrcという設定ファイルを作成します。

“`conf

Default user agent

user-agent = “My Custom Curl/1.0”

Always follow redirects

location

Save output to a file by default

output = “output.html”

Add a custom header

header = “X-Requested-With: curl”

Specify a proxy

proxy = “http://proxy.example.com:8080”
“`

この設定ファイルを使うには、以下のコマンドを実行します。

bash
curl -K curlrc https://example.com

特定のオプションだけをファイルに書いておき、他のオプションはコマンドラインで指定することも可能です。コマンドラインで指定されたオプションは、通常、設定ファイルの内容よりも優先されます。

~/.curlrcというファイルは、特に指定しない限りcurlが自動的に読み込もうとします。グローバルな設定や、よく使うオプションをここに記述しておくと便利です。

APIテストでの活用事例

Web APIの開発やテストにおいて、curlは非常に強力なツールとなります。

  • GETリクエストでデータを取得:
    bash
    curl https://api.github.com/users/octocat
  • POSTリクエストでデータを送信し、新しいリソースを作成:
    bash
    curl -X POST -H 'Content-Type: application/json' \
    -d '{"title":"New Article","body":"This is the content."}' \
    https://api.example.com/articles
  • PUTリクエストでリソースを更新:
    bash
    curl -X PUT -H 'Content-Type: application/json' \
    -d '{"title":"Updated Article Title"}' \
    https://api.example.com/articles/123
  • DELETEリクエストでリソースを削除:
    bash
    curl -X DELETE https://api.example.com/articles/123
  • 認証が必要なAPIへのアクセス:
    “`bash
    # Basic認証
    curl -u ‘apiuser:apipassword’ https://api.example.com/protected/resource

    Bearerトークン認証 (Authorizationヘッダーを使用)

    curl -H ‘Authorization: Bearer YOUR_ACCESS_TOKEN’ https://api.example.com/protected/resource
    * **レスポンスヘッダーとボディを同時に確認:**bash
    curl -i https://api.github.com/users/octocat
    * **APIからのJSONレスポンスを整形して表示:** `jq`のようなJSON処理ツールと組み合わせて使用します。bash
    curl -s https://api.github.com/users/octocat | jq .
    “`

シェルスクリプトでの活用

curlはシェルスクリプトの中でインターネット上のデータを取得したり、外部サービスと連携したりするために頻繁に利用されます。

  • ウェブサイトの可用性チェック:
    bash
    if curl -s -o /dev/null -w "%{http_code}" https://example.com | grep -q "200"; then
    echo "Website is up!"
    else
    echo "Website is down."
    fi

    -sで標準出力を抑制し、-o /dev/nullでボディを破棄、-w "%{http_code}"でHTTPステータスコードのみを取得しています。grep -q "200"でステータスコードが200であるかを確認しています。

  • ファイルの自動ダウンロード:
    “`bash
    #!/bin/bash
    DOWNLOAD_URL=”https://example.com/data/latest.zip”
    OUTPUT_FILE=”latest_data.zip”

    echo “Downloading $DOWNLOAD_URL…”
    if curl -L -f -O “$DOWNLOAD_URL”; then # -L: リダイレクト追跡, -f: エラー時は非0終了コード
    echo “Download complete: $OUTPUT_FILE”
    else
    echo “Download failed.” >&2
    exit 1
    fi
    ``-f(fail) オプションは、HTTPエラー(404 Not Found, 500 Internal Server Errorなど)が発生した場合に、HTMLコンテンツを表示するのではなく、curl`が非0の終了コードを返すようにします。これにより、スクリプトでエラーを検知しやすくなります。

  • 定期的なデータ取得: cronジョブなどと組み合わせて、定期的に外部からデータを取得し、ファイルに保存したり処理したりするスクリプトを作成できます。

curlをスクリプトで使う際は、-s (silent) オプションで余分な出力を抑制し、-f (fail) オプションでエラーハンドリングを容易にするのが一般的です。また、終了コード($?)を確認することも重要です。

まとめ

この記事では、curlコマンドの基本的な使い方から、HTTPリクエストの詳細な制御、FTPやその他のプロトコルとの連携、さらには高度な活用法まで、幅広く解説しました。

  • インストール: 多くのOSにプリインストールされていますが、必要に応じてパッケージマネージャーや公式サイトから入手できます。curl --versionで確認しましょう。
  • 基本: curl <URL>でデータを取得し、標準出力に表示します。-o-Oでファイルに保存できます。
  • HTTP: -Xでメソッド指定、-Hでヘッダー追加、-d-Fでボディデータ送信、-Lでリダイレクト追跡、-b/-cでクッキー管理、-uで認証、-kでSSL検証無効化などが可能です。
  • FTP: ftp://スキームを使用し、-Tでアップロード、-uでログインします。
  • その他: SCP/SFTP、file://-xでのプロキシ設定、タイムアウト設定 (--connect-timeout, --max-time) など多くの機能があります。
  • 高度な活用: -vでのデバッグ、-wでの書式指定出力、設定ファイル (-K)、ブレース展開/シーケンス、APIテスト、シェルスクリプトでの利用など、その応用範囲は非常に広いです。

curlは、その多様な機能とオプションによって、コマンドラインからのネットワーク通信に関するほとんどのタスクをこなすことができます。この記事で紹介した内容は、curlができることのほんの一部に過ぎません。

さらに詳しく学びたい場合は、公式のドキュメントやmanページ(man curl)を参照してください。manページは非常に詳細で包括的な情報源ですが、最初は量が多すぎて圧倒されるかもしれません。この記事を基本的なリファレンスとして活用しつつ、必要に応じてmanページで特定のオプションや機能について掘り下げていくのが良いでしょう。

curlをマスターすることは、開発、システム管理、ネットワーク調査など、様々な分野であなたの能力を大きく向上させるはずです。ぜひ、実際に手を動かして様々なオプションを試してみてください。実践を通じて、curlの持つ強力なパワーを実感できるでしょう。

Happy curling!


コメントする

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

上部へスクロール