【入門】curl.exeの使い方徹底ガイド!HTTP通信やファイル転送も

はい、承知いたしました。curl.exeの使い方に関する詳細な技術記事を作成します。約5000語で、入門者向けに基礎から応用までを網羅し、HTTP通信やファイル転送を中心に解説します。記事の内容を直接表示します。


【入門】curl.exeの使い方徹底ガイド!HTTP通信やファイル転送も

Web開発、APIテスト、システム管理、あるいは単にインターネット上の情報を取得したいとき、コマンドラインから手軽にHTTP通信を行えるツールがあれば便利ですよね。そんなときに絶大な威力を発揮するのが curl です。特にWindows環境では curl.exe として利用でき、多くの開発者やシステム管理者に愛用されています。

この記事は、これから curl.exe を使ってみようと考えている入門者の方を対象に、基本的な使い方からHTTP通信の詳細、ファイル転送、さらには応用的なテクニックやトラブルシューティングまで、徹底的に解説します。この記事を読めば、あなたも curl.exe を自由自在に操り、さまざまなタスクを効率的にこなせるようになるでしょう。

この記事で学べること:

  • curlとは何か、その用途と特徴
  • Windowsでのcurl.exeのインストール方法
  • HTTP GET/POSTなど基本的なリクエストの実行方法
  • ヘッダーやボディデータの操作方法
  • ファイルのダウンロードとアップロード
  • 認証、リダイレクト、プロキシ、SSL/TLSなどの応用設定
  • 詳細なデバッグ方法やトラブルシューティング

さあ、curlの世界へ飛び込んでみましょう!

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

1.1 curlの定義と歴史

curl は、多くのプロトコルを使用してデータを転送するためのコマンドラインツールおよびライブラリ(libcurl)のプロジェクト名です。その名前は “Client for URLs” に由来しており、文字通りURLを使って様々な通信を行うためのものです。

curlは1997年に生まれたオープンソースプロジェクトで、当初はIRCボットが為替レートを取得するために作られました。そこから機能が拡張され、HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP, LDAPS, FILE, IMAP, POP3, SMTP, RTMP, RTSP, SMB, SMTPS, GOPHER, MQTTなど、非常に多くのプロトコルに対応する多機能なツールへと進化しました。

この記事では、特にWeb通信で最も一般的に使われる HTTP および HTTPS を中心に解説します。

1.2 curl.exeとcurlの違い(Windowsユーザー向け)

Windows環境でcurlを利用する場合、通常は curl.exe という実行ファイルを使います。機能的にはmacOSやLinuxで使われる curl コマンドとほぼ同じですが、実行ファイル名が .exe となっている点が異なります。この記事ではWindowsユーザーを意識して curl.exe と記述しますが、macOSやLinuxで curl コマンドを使う方にとっても内容は非常に参考になるはずです。コマンドのオプションなどは共通です。

1.3 なぜcurlを使うのか? curlの強力な点

なぜGUIのブラウザだけでなく、コマンドラインツールであるcurlを使う必要があるのでしょうか?それには以下のような理由があります。

  • 自動化とスクリプト化: curlはコマンドラインツールなので、バッチファイルやシェルスクリプト、他のプログラミング言語から簡単に呼び出して処理を自動化できます。定期的なデータ取得、APIテストの自動実行などに役立ちます。
  • デバッグとテスト: WebサーバーやAPI開発において、ブラウザでは難しい低レベルな通信内容(リクエストヘッダー、レスポンスヘッダー、ステータスコードなど)を詳細に確認できます。特定のリクエストヘッダーを付けたり、様々なHTTPメソッドを試したり、エラー応答を確認したりするのに最適です。
  • 柔軟な制御: ブラウザではできない細かな制御(タイムアウト設定、帯域幅制限、認証方式の指定、プロキシ設定など)がオプション指定で可能です。
  • 様々なプロトコルへの対応: HTTP/HTTPSだけでなく、FTPやSCPなど様々なプロトコルでファイル転送を行いたい場合にもcurl一つで対応できます。
  • シンプルさ: GUIアプリケーションを起動する必要がなく、コマンドラインから素早く実行できます。

特にWeb開発者やAPI利用者は、curlを使ってAPIの動作確認やデバッグを行う機会が非常に多いでしょう。curlの習得は、これらの作業効率を大幅に向上させます。

2. curlのインストール

curlは非常に広く使われているため、多くのOSには標準でインストールされているか、簡単にインストールできます。

2.1 Windowsでのインストール

Windows 10以降のバージョンであれば、多くの環境でcurlが標準でプリインストールされています。まずはコマンドプロンプトやPowerShellを開いて、以下のコマンドを実行してみてください。

cmd
curl --version

または

powershell
curl --version

もしバージョン情報が表示されれば、インストール済みです。もし「’curl’ は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」のようなエラーが表示される場合は、インストールが必要です。

インストール方法(Windows):

  1. 公式ダウンロード: curlの公式サイトからWindows版のバイナリをダウンロードするのが最も確実な方法です。
    • curl公式ダウンロードページ: https://curl.se/download.html
    • curl and libcurl のセクションから、お使いのWindowsのアーキテクチャ(通常は64-bit)に合ったバージョンを探します。インストーラー版(.msi)か、zipアーカイブ版があります。インストーラー版が簡単でおすすめです。
    • ダウンロードしたインストーラーを実行し、指示に従ってインストールします。インストール時に「Add the directory to PATH」のようなオプションがあればチェックを入れておくと、環境変数PATHにcurlの実行ファイルへのパスが追加され、どのディレクトリからでも curl コマンドが使えるようになります。
    • zipアーカイブ版の場合は、ダウンロードしたファイルを解凍し、中に含まれる curl.exe を使いやすい場所に配置します。必要に応じて、そのディレクトリのパスを環境変数PATHに追加すると便利です。
  2. Windows Package Manager (winget): Windows 10 2004以降で利用可能なwingetコマンドを使ってインストールすることもできます。
    cmd
    winget install curl.curl
  3. Scoop (パッケージマネージャー): Scoopを使っている場合は、以下のコマンドでインストールできます。
    cmd
    scoop install curl

インストール後、再度 curl --version コマンドを実行して、バージョン情報が表示されることを確認してください。

2.2 macOSおよびLinuxでのインストール

macOSや多くのLinuxディストリビューション(Ubuntu, Fedora, CentOSなど)では、curlは標準でインストールされています。すぐに curl --version を実行して確認できます。

もしインストールされていない場合は、各OSのパッケージマネージャーを使って簡単にインストールできます。

  • macOS (Homebrew):
    bash
    brew install curl
  • Debian/Ubuntu:
    bash
    sudo apt update
    sudo apt install curl
  • Fedora:
    bash
    sudo dnf install curl
  • CentOS/RHEL (dnf または yum):
    bash
    sudo dnf install curl # または sudo yum install curl

インストールが完了したら、curl --version で確認しましょう。

2.3 バージョンの確認

curl --version コマンドは、インストールされているcurlのバージョン、サポートしているプロトコル、リンクされているライブラリなどの情報を表示します。

“`cmd
curl –version

例(環境によって出力は異なります)

curl 7.79.1 (x86_64-pc-win32) libcurl/7.79.1 Schannel zlib/1.2.11

Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp

Features: AsynchDNS GSS-API Kerberos SPNEGO NTLM SSL libz

“`

この情報を見ると、お使いのcurlがどのような機能をサポートしているかが分かります。特に Protocols: のリストに httphttps が含まれていることを確認してください。

3. curlの基本中の基本: HTTP GETリクエスト

curlで最も頻繁に使うのは、Webサーバーから情報を取得するHTTP GETリクエストです。これは、ブラウザでURLを開く操作に相当します。

3.1 最もシンプルな使い方

URLを指定して curl コマンドを実行するだけで、そのURLに対するGETリクエストが行われ、サーバーからの応答ボディ(HTMLなど)が標準出力(コマンドプロンプト/PowerShellの画面)に表示されます。

cmd
curl https://www.example.com/

このコマンドを実行すると、https://www.example.com/ のHTMLソースコードが画面にダーッと表示されます。

3.2 デフォルトの挙動

  • HTTPメソッド: デフォルトはGETです。特に指定しない限りGETリクエストが送信されます。
  • 出力先: デフォルトでは、サーバーからの応答ボディ(HTML, JSON, 画像データなど)が標準出力にそのまま表示されます。バイナリデータ(画像や実行ファイルなど)の場合、画面に意味不明な文字の羅列が表示されることがあります。
  • レスポンスヘッダー: デフォルトでは、サーバーからの応答ヘッダー(ステータスコード、Content-Type、Set-Cookieなど)は表示されません。表示させたい場合はオプションが必要です(後述)。
  • 進捗表示: デフォルトでは、データのダウンロード中に簡単な進捗状況が表示されます。ファイルサイズ、ダウンロード速度、残り時間などが表示されます。

3.3 進捗表示をなくす (-s, --silent)

コマンドの出力に余計な進捗情報を表示させたくない場合は、-s または --silent オプションを使います。

cmd
curl -s https://www.example.com/

スクリプトでcurlを使う場合など、取得したデータだけが必要な場合に便利です。

3.4 詳細な情報を表示する (-v, --verbose)

通信の詳細な過程を確認したい場合は、-v または --verbose オプションを使います。これにより、リクエストヘッダー、レスポンスヘッダー、SSL/TLS接続情報などが詳細に表示されます。デバッグ時に非常に役立ちます。

cmd
curl -v https://www.example.com/

出力例(一部抜粋、長いので):

“`
* Trying 93.184.216.34:443…
* Connected to www.example.com (93.184.216.34) port 443 (#0)
* schannel: SSL/TLS connection with www.example.com, negotiated TLSv1.2
* schannel: Read buffer: len 1024
* schannel: Encrypted data received: len 1024
* schannel: Decrypted data buffer: len 1024
* schannel: Decrypted data:
* schannel: SSL/TLS handshake complete

GET / HTTP/1.1 # これが送信されたリクエストの最初の行
Host: www.example.com # これが送信されたリクエストヘッダー
User-Agent: curl/7.79.1
Accept: /

  • schannel: Read buffer: len 1024
    < HTTP/1.1 200 OK # これがサーバーからの応答の最初の行(ステータスライン)
    < Content-Encoding: gzip # これがサーバーからの応答ヘッダー
    < Accept-Ranges: bytes
    < Cache-Control: max-age=604800
    < Content-Type: text/html # レスポンスのMIMEタイプ
    < Date: Tue, 14 Nov 2023 08:00:00 GMT
    < Etag: “3147526947”
    < Expires: Tue, 21 Nov 2023 08:00:00 GMT
    < Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
    < Server: ECS (chd/2A2B)
    < X-Cache: HIT
    < Content-Length: 1256 # 応答ボディのサイズ
    <
    { [1256 bytes data] # ここから応答ボディが続きます
    … (HTMLコードなど) …
    “`

出力の > で始まる行はcurlが送信したリクエストヘッダー、< で始まる行はサーバーからの応答ヘッダーです。* で始まる行は、curlが通信の過程で表示する情報(接続試行、SSLハンドシェイクなど)です。

3.5 レスポンスヘッダーのみ表示 (-I, --head)

応答ボディは不要で、ヘッダー情報だけを確認したい場合は、-I または --head オプションを使います。これは、HTTP HEADメソッドでリクエストを送信します。HEADメソッドはGETメソッドと同様に動作しますが、サーバーは応答ヘッダーだけを返し、ボディは返しません。

cmd
curl -I https://www.example.com/

このコマンドは、-v で見た < で始まる行だけを(一部異なる場合もありますが)表示するようなイメージです。Webサイトの最終更新日やContent-Type、リダイレクト先などを素早く確認したいときに便利です。

3.6 レスポンスヘッダーも含めて表示 (-i, --include)

応答ボディだけでなく、レスポンスヘッダーも一緒に表示したい場合は、-i または --include オプションを使います。これはGETリクエストを送信し、ヘッダーとボディの両方を取得・表示します。

cmd
curl -i https://www.example.com/

-v と似ていますが、-i は通信の詳細な過程は表示せず、単にレスポンスヘッダーとボディを連結して表示するだけです。

4. HTTP通信の基本をマスターする

基本的なGETリクエストができるようになったところで、HTTP通信をより深く制御する方法を見ていきましょう。HTTPメソッド、ヘッダー、ボディデータの送信、認証、リダイレクト、プロキシなどがcurlでどのように扱えるかを解説します。

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

デフォルトはGETですが、他のHTTPメソッド(POST, PUT, DELETEなど)でリクエストを送信したい場合は、-X または --request オプションでメソッド名を指定します。

“`cmd

POSTメソッドでリクエスト

curl -X POST https://api.example.com/items

DELETEメソッドでリクエスト

curl -X DELETE https://api.example.com/items/123
“`

-X オプションはメソッド名を指定するだけなので、POSTやPUTなどでデータを送信する場合は、別途データ指定のオプション(-d, -F, -T など)が必要です。

4.2 ボディデータの送信

POSTやPUTなどのメソッドで、リクエストボディにデータを含めて送信する方法はいくつかあります。

4.2.1 フォームデータの送信 (-d, --data)

最も一般的なのは、HTMLフォームのようにキーと値のペアを送信するケースです。これは-d または --data オプションを使います。データは キー1=値1&キー2=値2 の形式で指定します。デフォルトでは Content-Type: application/x-www-form-urlencoded ヘッダーが付加されます。

“`cmd

フォームデータをPOST送信

curl -X POST -d “name=Alice&age=30” https://api.example.com/users
“`

-d オプションは複数回指定することも可能です。

“`cmd

-dを複数回指定

curl -X POST -d “name=Alice” -d “age=30” https://api.example.com/users
“`

-d オプションはデフォルトでPOSTメソッドを使用するため、GETでボディデータを送信したい場合など、メソッドを明示したい場合は -X POST のように -X を併用します。ただし、通常GETリクエストにボディデータを含めることはありません。

URLエンコーディング: -d で指定したデータは、curlによって自動的にURLエンコーディングされます(例: スペースが %20 になるなど)。もしエンコーディングを抑制したい場合は --data-raw を使います。

4.2.2 ファイルの内容をボディとして送信 (--data-binary, --data-urlencode)

ファイルの内容をそのままリクエストボディとして送信したい場合は --data-binary を使います。これはファイルアップロードというよりは、JSONファイルなどをPOSTする場合に便利です。ファイル名の前に @ を付けます。

“`cmd

JSONファイルをPOST送信

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

@user.json は現在のディレクトリにある user.json ファイルを指します。パスを指定することも可能です。

-d と同様に @ を使うことでファイルの内容を読み込めますが、-d はフォームデータ形式として扱い、改行などをエンコードする可能性があるのに対し、--data-binary は生のバイナリデータを扱います。JSONなどの構造化データを送信する場合は --data-binary が推奨されることが多いです。

URLエンコーディングが必要なデータをファイルから読み込む場合は --data-urlencode を使います。例えば、ファイル data.txtkey=value with spaces と書かれているとして、これをURLエンコードして送信する場合:

“`cmd
curl -X POST –data-urlencode “@data.txt” https://api.example.com/submit

送信されるデータ例: key=value%20with%20spaces

“`

4.2.3 マルチパートフォームデータの送信 (ファイルアップロードなど) (-F, --form)

HTMLの <form enctype="multipart/form-data"> のように、ファイルと他のフォームデータを組み合わせて送信したい場合は、-F または --form オプションを使います。これはWebサイトでファイルアップロードを行う際によく使われます。

-F オプションは name=value の形式で指定します。ファイルの場合は name=@filename の形式で指定します。

“`cmd

ファイルとテキストデータを同時にPOST送信(ファイルアップロードフォームのシミュレーション)

curl -F “username=Alice” -F “[email protected]” https://api.example.com/upload
“`

このコマンドを実行すると、profile_image という名前で photo.jpg ファイルが、username という名前で Alice という値が、それぞれmultipart/form-data形式で送信されます。curlは自動的に Content-Type: multipart/form-data; boundary=... ヘッダーを付加します。

ファイルの種類(MIMEタイプ)を明示したい場合は、ファイル名の後に ;type=MIMEタイプ を追加します。

cmd
curl -F "[email protected];type=image/jpeg" https://api.example.com/upload

4.2.4 ファイルをPUTメソッドでアップロード (-T, --upload-file)

ファイルをPUTメソッドでサーバーにアップロードする場合、-T または --upload-file オプションを使います。これはFTPやWebDAVなど、ファイルをサーバー上の特定のパスに直接配置するような操作に適しています。

“`cmd

ファイルをPUTメソッドでアップロード

curl -T document.txt https://webdav.example.com/path/to/document.txt
“`

4.3 ヘッダーの操作

リクエストヘッダーは、クライアント(curl)がサーバーに送信する追加情報です。ユーザーエージェント、Acceptタイプ、認証情報などが含まれます。レスポンスヘッダーは、サーバーがクライアントに返す追加情報で、ステータスコード、Content-Type、Set-Cookieなどを含みます。

4.3.1 リクエストヘッダーの指定 (-H, --header)

独自のリクエストヘッダーを追加したり、既存のヘッダーを上書きしたりする場合は、-H または --header オプションを使います。ヘッダー名は : の後に値を付けて指定します。

“`cmd

カスタムヘッダーを追加

curl -H “X-Custom-Header: my_value” https://api.example.com/data

JSONデータ送信時にContent-Typeヘッダーを指定

curl -X POST -H “Content-Type: application/json” -d ‘{“key”: “value”}’ https://api.example.com/items

Acceptヘッダーを指定(受け付け可能なレスポンス形式)

curl -H “Accept: application/json” https://api.example.com/data
“`

特定のヘッダーを削除したい場合は、ヘッダー名の後に : を付け、値を空にするか、あるいはセミコロン ; を付けます。

“`cmd

User-Agentヘッダーを削除(通常curlはデフォルトでUser-Agentを送信する)

curl -H “User-Agent:” https://www.example.com/

または

curl -H “User-Agent;” https://www.example.com/

“`

-H オプションは複数回指定できます。

4.3.2 レスポンスヘッダーの表示 (-i, --include)

既に説明しましたが、サーバーからのレスポンスヘッダーをボディと一緒に表示するには -i オプションを使います。

4.3.3 レスポンスヘッダーのみ表示 (-I, --head)

これも既に説明しましたが、レスポンスヘッダーのみを表示するには -I オプションを使います。

4.4 認証

WebサイトやAPIにアクセスする際に認証が必要な場合があります。curlは様々な認証方式に対応しています。

4.4.1 Basic認証 (-u, --user)

最も一般的な認証方式の一つであるBasic認証を行うには、-u または --user オプションを使います。ユーザー名とパスワードを : で区切って指定します。

“`cmd

Basic認証を使ってアクセス

curl -u “myuser:mypassword” https://api.example.com/protected
“`

パスワードをコマンドラインに直接書きたくない場合は、ユーザー名だけを指定して : は付けずに実行します。すると、curlが対話式にパスワード入力を促します。

“`cmd

パスワードを対話式で入力

curl -u “myuser” https://api.example.com/protected

Enter host password for user ‘myuser’: プロンプトが表示されるので入力

“`

4.4.2 Bearerトークン認証 (OAuth 2.0などで利用)

REST APIなどでよく使われるBearerトークンによる認証は、Authorization リクエストヘッダーにトークンを含めることで行います。これは -H オプションを使って実現できます。

“`cmd

BearerトークンをAuthorizationヘッダーに含めてアクセス

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

4.4.3 その他の認証方式

curlはDigest認証、NTLM認証、Kerberos認証など、より高度な認証方式にも対応しています。これらは --digest, --ntlm, --negotiate などのオプションを使いますが、入門としては上記のBasic認証とBearerトークン認証を覚えておけば十分でしょう。

4.5 リダイレクトの扱い (-L)

Webサーバーは、リクエストされたURLに対して別のURLにリダイレクトするよう指示を返すことがあります(HTTPステータスコード 3xx)。ブラウザは通常この指示に従って自動的にリダイレクト先のURLにアクセスしますが、curlはデフォルトではリダイレクトを追跡しません。

リダイレクトを自動的に追跡させたい場合は、-L または --location オプションを使います。

“`cmd

デフォルト(リダイレクトを追跡しない)

curl http://example.com/old-page # 301 Moved Permanently などのレスポンスが返ってくる

リダイレクトを自動追跡

curl -L http://example.com/old-page # 最終的なページの内容が取得できる
“`

-L オプションを使うと、curlは最大で指定された回数(デフォルトは50回)までリダイレクトを追跡します。リダイレクトが繰り返されると、タイムアウトしたりエラーになったりすることがあります。

4.6 プロキシの設定 (-x)

ファイアウォールの内側からインターネット上のリソースにアクセスする場合など、HTTPプロキシやSOCKSプロキシを経由する必要があることがあります。プロキシを設定するには -x または --proxy オプションを使います。

プロキシの形式は [プロトコル://]ホスト名[:ポート番号] です。プロトコルを指定しない場合は、リクエスト先のURLのプロトコルと同じものが使われます(HTTP/HTTPSリクエストならHTTPプロキシ)。ポート番号のデフォルトはHTTPプロキシなら80、SOCKSプロキシなら1080です。

“`cmd

HTTPプロキシを経由してアクセス (ポート番号はデフォルトの80)

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

HTTPプロキシを経由してアクセス (ポート番号を指定)

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

SOCKS5プロキシを経由してアクセス

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

プロキシ認証が必要な場合は、-U または --proxy-user オプションを使います。形式は -u と同様に ユーザー名:パスワード です。

“`cmd

認証付きHTTPプロキシを経由してアクセス

curl -x http://proxy.example.com:8080 -U “proxyuser:proxypass” https://www.example.com/
“`

4.7 SSL/TLSの設定

HTTPSプロトコルで通信する場合、SSL/TLSによる暗号化とサーバー証明書の検証が行われます。

4.7.1 証明書の検証を無効にする (-k, --insecure)

通常、curlはサーバー証明書が信頼できる認証局によって発行されているか、証明書のドメイン名がアクセス先のホスト名と一致するかなどを検証します。検証に失敗すると、通信は中断されエラーになります。

開発環境や自己署名証明書を使っているサーバーなど、証明書の検証をスキップしたい場合は、-k または --insecure オプションを使います。

“`cmd

証明書の検証をスキップ(非推奨!セキュリティリスクあり!)

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

重要: -k オプションはセキュリティリスクを伴います。中間者攻撃(Man-in-the-Middle attack)を受ける可能性があり、通信が傍受されたり改ざんされたりする恐れがあります。本番環境や信頼できないサイトへのアクセスでは絶対に使用しないでください。 あくまで開発や検証目的で、リスクを理解した上で一時的に使用するオプションです。

4.7.2 クライアント証明書 (--cert, --key)

サーバー側がクライアント証明書による認証を要求する場合、curlはクライアント証明書を提示できます。

“`cmd

クライアント証明書を指定してアクセス

curl –cert client.pem –key client.key https://auth.example.com/
“`

証明書や秘密鍵の形式、パスフレーズの指定など、詳細はcurlのドキュメントを参照してください。

5. ファイル転送

curlは強力なファイルダウンロード・アップロードツールでもあります。

5.1 ファイルのダウンロード

Web上のファイルをダウンロードする場合、curlは非常に手軽で柔軟な方法を提供します。

5.1.1 標準出力への出力 (デフォルト)

既に説明したように、URLを指定するだけの最もシンプルな使い方は、ダウンロードしたファイルの内容を標準出力に表示します。

cmd
curl https://www.example.com/path/to/document.txt

これはテキストファイルやHTMLファイルなど、内容をそのまま見たい場合に便利です。バイナリファイルの場合は画面が崩れるだけなので、ファイルとして保存する必要があります。

5.1.2 ファイル名の指定保存 (-o, --output)

ダウンロードしたデータを指定したファイル名で保存するには、-o または --output オプションを使います。

“`cmd

リモートの document.txt をローカルの local_doc.txt という名前で保存

curl -o local_doc.txt https://www.example.com/path/to/document.txt

画像ファイルをダウンロードして保存

curl -o my_image.jpg https://www.example.com/images/photo.jpg
“`

5.1.3 リモートファイル名での自動保存 (-O, --remote-name)

ダウンロードしたいファイルのリモートのファイル名をそのまま使ってローカルに保存したい場合は、-O または --remote-name オプションを使います(ハイフンではなく大文字のオーです)。

“`cmd

リモートの photo.jpg をローカルでも photo.jpg という名前で保存

curl -O https://www.example.com/images/photo.jpg
“`

このオプションは、URLの最後のパスセグメントをファイル名として使用します。例えば https://www.example.com/downloads/archive/data.zip-O でダウンロードすると、ローカルには data.zip というファイル名で保存されます。

5.1.4 複数のファイルを同時にダウンロード

複数のファイルをダウンロードする場合、URLをスペース区切りで複数指定し、-O オプションを使うと便利です。

“`cmd

複数のファイルをそれぞれのファイル名でダウンロード

curl -O https://www.example.com/file1.zip -O https://www.example.com/file2.tar.gz
“`

-o オプションと組み合わせることも可能ですが、URLの数と -o の数が一致している必要があります。

“`cmd

複数のファイルを異なる名前でダウンロード

curl -o file1_local.zip https://www.example.com/file1.zip -o file2_local.tar.gz https://www.example.com/file2.tar.gz
“`

5.1.5 部分ダウンロードとダウンロード再開 (-C, --continue-at)

大きなファイルをダウンロード中に中断してしまった場合など、途中からダウンロードを再開したいことがあります。-C または --continue-at オプションを使うと、既にダウンロード済みの部分以降からダウンロードを再開できます。

“`cmd

ダウンロードを中断したファイルを再開

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

-C - とハイフンを指定すると、curlはローカルに同名のファイルが存在するかを確認し、ファイルのサイズからダウンロードを再開すべきオフセット位置を自動的に判断します。これは非常に便利です。手動でオフセット位置を指定することも可能ですが、通常は -C - で十分です。

5.2 ファイルのアップロード

FTPやWebDAVサーバーなどに対し、ローカルのファイルをアップロードすることも可能です。

5.2.1 PUTメソッドによるアップロード (-T, --upload-file)

既に4.2.4で触れましたが、ファイルを指定したURLにPUTメソッドでアップロードする際に -T オプションを使います。

“`cmd

ローカルの document.txt を WebDAV サーバーの指定パスにアップロード

curl -T document.txt https://webdav.example.com/path/to/document.txt
“`

5.2.2 POSTメソッドによるファイル送信 (-F, --form)

これも4.2.3で触れましたが、Webアプリケーションのファイルアップロードフォームを模倣して、multipart/form-data形式でファイルを送信するには -F オプションを使います。

“`cmd

ファイルと他のデータを同時にPOST送信

curl -F “[email protected]” -F “description=My profile pic” https://api.example.com/upload
“`

6. 詳細設定と応用テクニック

curlはさらに多くのオプションを提供しており、様々な細かい設定や応用的な使い方が可能です。

6.1 タイムアウトの設定

ネットワークが遅い、サーバーの応答が遅いといった場合に、無限に待ち続けないようにタイムアウトを設定できます。

  • 接続タイムアウト (--connect-timeout): サーバーへのTCP接続が確立されるまでの最大待ち時間を秒単位で指定します。
    cmd
    # 接続試行から5秒でタイムアウト
    curl --connect-timeout 5 https://slow.example.com/
  • 全処理タイムアウト (-m, --max-time): リクエストの開始から完了までの全処理の最大時間を秒単位で指定します。
    cmd
    # 通信開始から10秒でタイムアウト
    curl -m 10 https://large-file.example.com/

6.2 帯域幅の制限 (--limit-rate)

ダウンロードやアップロードの速度を制限したい場合に --limit-rate オプションを使います。単位はバイト/秒で、k(キロバイト)、m(メガバイト)、g(ギガバイト)を付けて指定できます。

“`cmd

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

curl –limit-rate 100k -O https://www.example.com/large_file.zip

アップロード速度を1MB/sに制限

curl –limit-rate 1m -T large_file.zip ftp://upload.example.com/
“`

6.3 クッキーの扱い

Webサイトはユーザーの状態を維持するためにクッキー(Cookie)を使用します。curlもクッキーの送受信を扱うことができます。

  • 受信したクッキーをファイルに保存 (-c, --cookie-jar): サーバーからセットされたクッキーをファイルに保存します。ログインが必要なサイトなどで、ログイン後に受け取ったセッションクッキーを保存しておき、後続のリクエストで再利用したい場合に便利です。
    cmd
    # ログインページにアクセスしてクッキーを保存
    curl -c cookies.txt https://www.example.com/login -d "user=..."

    cookies.txt には、curlが理解できる形式でクッキー情報が書き込まれます。
  • 保存したクッキーをリクエストで送信 (-b, --cookie): -c で保存したクッキーファイルを読み込み、その中のクッキーをリクエストヘッダー(Cookie:)に含めて送信します。
    cmd
    # 保存したクッキーを使ってログイン後のページにアクセス
    curl -b cookies.txt https://www.example.com/protected_page

    -b オプションにはファイル名だけでなく、直接クッキー文字列を指定することも可能です。
    cmd
    # クッキー文字列を直接指定
    curl -b "sessionid=abcdef123456; username=Alice" https://www.example.com/

6.4 ユーザーエージェントの指定 (-A, --user-agent)

curlはデフォルトで自身のユーザーエージェント文字列(例: curl/7.79.1)を送信します。Webサーバーはユーザーエージェントを見て、ブラウザの種類やバージョンを判別したり、表示内容を変えたりすることがあります。ブラウザからのアクセスを装いたい場合など、ユーザーエージェントを変更したい場合は -A オプションを使います。

“`cmd

ブラウザのユーザーエージェントを偽装

curl -A “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36” https://www.example.com/
“`

6.5 リファラーの指定 (--referer)

HTTP Refererヘッダーは、どのページからリンクを辿って現在のページにアクセスしたかを示す情報です。Webサイトによっては、特定のRefererヘッダーがないとアクセスを拒否したり、異なるコンテンツを返したりすることがあります。Refererを指定したい場合は --referer オプションを使います。

“`cmd

リファラーを指定してアクセス

curl –referer “https://www.example.com/previous_page” https://www.example.com/next_page
“`

6.6 進捗表示のカスタマイズ

デフォルトの進捗表示以外にも、いくつかの表示形式があります。

  • プログレスバー表示 (-#, --progress-bar): ダウンロード中に # の羅列によるプログレスバーを表示します。ファイルサイズが大きく、進捗を視覚的に確認したい場合に便利です。
    cmd
    curl -# -O https://www.example.com/large_file.zip
  • 詳細な進捗表示 (--progress-meter): デフォルトの表示形式です。敢えて指定する必要はあまりありませんが、他の進捗表示オプションを無効にしてデフォルトに戻したい場合などに使います。
  • 進捗表示を完全に非表示 (-s, --silent): 既に説明しましたが、-s オプションです。

6.7 デバッグ情報の表示

-v (verbose) オプションは通信の概要を把握するのに便利ですが、さらに低レベルなデバッグ情報が必要な場合もあります。

  • トレース情報の出力 (--trace): 通信の各ステップ(接続、SSLハンドシェイク、送受信データなど)を詳細にログファイルや標準出力に出力します。バイナリデータを含む出力になります。
    cmd
    # トレース情報をファイルに保存
    curl --trace output.log https://www.example.com/
  • ASCII形式のトレース情報出力 (--trace-ascii): --trace と似ていますが、バイナリデータは表示せず、ASCII形式で表示可能な部分のみを出力します。人間が読みやすい形式です。
    cmd
    # ASCII形式のトレース情報を標準出力に表示
    curl --trace-ascii - https://www.example.com/ # - は標準出力を意味する

6.8 エラーハンドリング (--fail)

デフォルトでは、サーバーがHTTPエラー応答(ステータスコード400以上)を返しても、curlはそれを「成功」として扱い、サーバーからの応答ボディ(エラーメッセージなど)をそのまま表示して終了します。

サーバーがエラー応答を返した場合に、curl自体をエラーとして終了させたい場合は、--fail オプションを使います。これにより、スクリプト中でcurlの実行結果を$?(終了ステータス)で判定し、エラーが発生したかどうかを判断しやすくなります。

“`cmd

存在しないページにアクセス(通常は404エラーが返る)

curl https://www.example.com/non-existent-page # curlは成功終了し、404ページの内容を表示

–fail を付けてアクセス

curl –fail https://www.example.com/non-existent-page # curlはエラー終了し、終了ステータスは22(HTTPエラー)になる
“`

6.9 設定ファイル (-K, --config)

頻繁に使用するオプションの組み合わせがある場合、それを設定ファイルに記述しておき、-K オプションで読み込むことができます。これにより、コマンドラインが長くなるのを避けられます。

“`cmd

設定ファイル curlrc.txt の内容

url = “https://api.example.com/data”

user-agent = “MyCustomClient/1.0”

header = “Accept: application/json”

verbose

“`

“`cmd

設定ファイルを読み込んで実行

curl -K curlrc.txt
“`

設定ファイルの詳細な記述方法はcurlの公式ドキュメントを参照してください。一部のシステムでは、特定の場所に置かれた設定ファイル(例: ~/.curlrc)がデフォルトで読み込まれることもあります。

7. curlの内部動作を理解する (より深く理解したい方向け)

-v オプションを使うとcurlの内部動作の一部を垣間見ることができますが、curlが具体的にどのようなステップで通信を行っているかを理解すると、デバッグがより容易になります。

curlがHTTP/HTTPSでリクエストを送信し、レスポンスを受信するまでの主なステップは以下の通りです。

  1. URLの解析: 指定されたURL(例: https://www.example.com:443/path/to/resource?query=value)を解析し、プロトコル (https), ホスト名 (www.example.com), ポート番号 (443), パス (/path/to/resource), クエリ文字列 (query=value) などを抽出します。ポート番号が省略されている場合は、プロトコルに応じたデフォルトポート(HTTPは80, HTTPSは443)が使用されます。
  2. ホスト名の解決 (DNSルックアップ): ホスト名(www.example.com)に対応するIPアドレスを取得します。OSのDNSリゾルバや /etc/hosts ファイルなどを参照します。-v 出力では Trying IP_ADDRESS... のように表示されます。
  3. TCPコネクションの確立: 取得したIPアドレスとポート番号に対して、サーバーとのTCPコネクションを確立します。これは、クライアントとサーバー間でSYN/SYN-ACK/ACKというパケットを交換して行われます。-v 出力では Connected to HOST (IP_ADDRESS) port PORT (#CONNECTION_ID) のように表示されます。
  4. SSL/TLSハンドシェイク (HTTPSの場合): HTTPSの場合、TCPコネクション確立後、実際のHTTPデータを送受信する前にSSL/TLSハンドシェイクが行われます。これは、クライアントとサーバー間で暗号化方式を決定し、セッション鍵を生成し、サーバー証明書を検証するプロセスです。-v 出力では schannel: SSL/TLS connection..., SSL/TLS handshake complete のように表示されます(使用されるSSL/TLSライブラリによって出力は異なります)。ここで証明書の検証に失敗するとエラー終了します(-k オプションでスキップ可能)。
  5. HTTPリクエストの構築と送信: 指定されたHTTPメソッド(GET, POSTなど)、パス、クエリ文字列、HTTPバージョン(通常HTTP/1.1)、そして指定されたリクエストヘッダー(Host, User-Agent, Acceptなど、-H で指定したもの、-b で指定したクッキーなど)を含むHTTPリクエストメッセージを構築し、サーバーに送信します。POSTやPUTなどでボディデータがある場合は、ヘッダーに続いてボディデータも送信します。-v 出力では > GET /... HTTP/1.1, > Host: ..., > User-Agent: ... などのように表示されます。
  6. HTTPレスポンスの受信: サーバーからの応答を受信します。まずステータスライン(例: HTTP/1.1 200 OK)とレスポンスヘッダー(Content-Type: ..., Content-Length: ..., Set-Cookie: ... など)を受信します。続いて、応答ボディを受信します。-v 出力では < HTTP/1.1 ..., < Content-Type: ... などのように表示されます。
  7. レスポンスの処理: 受信したレスポンスを処理します。デフォルトでは応答ボディを標準出力に表示します。-o-O オプションがあればファイルに保存します。-i オプションがあればヘッダーも表示します。リダイレクト応答(3xx)を受信し、かつ -L オプションが指定されていれば、新しいURLに対してステップ1から処理を繰り返します。
  8. コネクションの切断: 通信が完了したら、TCPコネクションを切断します。HTTP/1.1ではコネクションを再利用することもありますが、curlは通常、特に指定がなければリクエストごとにコネクションを切断します。

これらのステップを理解しておくと、curlが返すエラーメッセージ(例: Could not resolve host, Failed to connect, SSL connect errorなど)が、通信プロセスのどの段階で発生した問題なのかを特定する手助けになります。

8. 実践的なレシピ/例

これまでに学んだオプションを組み合わせて、より実践的なタスクを実行する例を見てみましょう。

例1: REST APIからJSONデータを取得する

GETリクエストを送信し、応答がJSON形式であることを期待する場合によく使うパターンです。

“`cmd

1. 単純にGETリクエスト(JSONがそのまま表示される)

curl https://api.example.com/users/123

2. JSON形式での応答を優先して要求する(Acceptヘッダーを指定)

curl -H “Accept: application/json” https://api.example.com/users/123

3. エラー時(例: ユーザーが存在しない404)にcurlをエラー終了させる

curl –fail https://api.example.com/users/123

4. ヘッダー情報も含めて確認したい場合

curl -i https://api.example.com/users/123

5. 通信過程も含めて詳細に確認したい場合

curl -v https://api.example.com/users/123
“`

例2: REST APIにJSONデータをPOSTする

APIに新しいリソースを作成したり、データを更新したりする際によく使われます。

“`cmd

JSONデータを含むファイルを用意

user.json の内容:

{

“name”: “Charlie”,

“email”: “[email protected]

}

JSONファイルを読み込み、Content-Typeヘッダーを指定してPOST送信

curl -X POST -H “Content-Type: application/json” –data-binary “@user.json” https://api.example.com/users

JSONデータをコマンドラインで直接指定してPOST送信

curl -X POST -H “Content-Type: application/json” -d ‘{“name”: “Charlie”, “email”: “[email protected]”}’ https://api.example.com/users
“`

コマンドラインでJSONを直接指定する場合、JSON文字列に含まれるダブルクォーテーションを適切にエスケープする必要があるため、シングルクォーテーション '...' で全体を囲む方が簡単です(Windowsのコマンドプロンプトではエスケープがやや複雑な場合があります。PowerShellやBashではシングルクォーテーションが便利です)。

例3: 認証が必要なAPIにアクセスする

Basic認証とBearerトークン認証の例です。

“`cmd

Basic認証

curl -u “apiuser:apipassword” https://api.example.com/protected

Bearerトークン認証

curl -H “Authorization: Bearer YOUR_API_TOKEN” https://api.example.com/another/protected
“`

例4: ファイルをダウンロードして保存し、進捗を表示する

大きなファイルをダウンロードする場合などに役立ちます。

“`cmd

リモートのファイル名で保存し、プログレスバーを表示

curl -O -# https://www.example.com/large_software_package.zip

ダウンロード速度を制限して保存

curl -O –limit-rate 500k https://www.example.com/large_software_package.zip

ダウンロードが中断した場合に再開

curl -C – -O https://www.example.com/large_software_package.zip
“`

例5: Webサイトにログインし、ログイン後のページを取得する

セッションクッキーを利用してログイン状態を維持する例です。

“`cmd

1. ログインページにPOSTリクエストを送信し、セッションクッキーを受け取り cookies.txt に保存

-c オプションでクッキーを保存。-d オプションでユーザー名とパスワードを送信。

-L オプションでログイン成功後のリダイレクト先も追跡する。

-s オプションで進捗表示は非表示に。

-i オプションで応答ヘッダー(Set-Cookieがあるか確認)も表示。(任意)

curl -L -s -c cookies.txt -d “username=myuser&password=mypass” https://www.example.com/login

2. 保存したクッキー (cookies.txt) を使って、ログイン後の保護されたページにアクセス

-b オプションでクッキーを送信。

curl -s -b cookies.txt https://www.example.com/protected_area
“`

この例では、まず最初の curl コマンドでログインフォームに認証情報をPOSTします。サーバーは認証に成功するとセッションクッキーを発行し、それをレスポンスヘッダーの Set-Cookie で返します。-c cookies.txt オプションにより、curlはそのクッキーを cookies.txt ファイルに保存します。-L オプションにより、ログイン成功後のリダイレクト先(通常はログイン後のトップページなど)にも自動的にアクセスします。

次に、2つ目の curl コマンドで、-b cookies.txt オプションを使って、前のステップで保存したクッキーをリクエストヘッダーに含めて送信します。これにより、サーバーはクライアントがログイン済みであることを認識し、保護されたコンテンツへのアクセスを許可します。

これは基本的なログイン処理のシミュレーションですが、実際のログイン処理はフォームの構造や認証方式によって異なります。-v オプションを使って通信内容を確認しながら進めるのが良いでしょう。

9. よくある問題とトラブルシューティング

curlを使っていてエラーに遭遇した場合、慌てずにエラーメッセージを確認することが重要です。curlは比較的親切なエラーメッセージを返します。主なエラーと対応方法を見ていきましょう。

エラーコードの見方

curlのエラーは、エラーコード(数値)と簡単な説明で示されます。curl: (XX) 説明 の形式です。主要なエラーコードは以下の通りです。

  • (6): Could not resolve host – 指定したホスト名(ドメイン名)をIPアドレスに変換できませんでした。DNSの問題、ホスト名の入力間違いなどが考えられます。
  • (7): Failed to connect to host port XX: Connection refused – サーバーの指定ポートに接続できませんでした。サーバーが起動していない、ファイアウォールでブロックされている、ポート番号の間違いなどが考えられます。
  • (22): The requested URL returned error: XXX – サーバーがHTTPエラー(4xxや5xxなど)を返しました。これは --fail オプションを指定した場合に発生するエラーです。指定しない場合は22エラーにはならず、サーバーのエラー応答ボディが表示されます。
  • (28): Operation timed out – 指定したタイムアウト時間内に処理が完了しませんでした(-m, --connect-timeout オプションなど)。ネットワークが遅い、サーバーの応答が遅い、または処理に時間がかかっているなどが考えられます。
  • (35): SSL connect error – SSL/TLS接続の確立に失敗しました。サーバー証明書が無効、証明書が信頼できない、クライアントとサーバー間でサポートされる暗号スイートが一致しないなどが考えられます。

トラブルシューティングのヒント

  1. エラーメッセージを読む: 最も重要です。エラーコードと説明をよく読み、何が問題なのか推測します。
  2. -v オプションを使う: 通信のどの段階でエラーが発生したのか、リクエストやレスポンスの詳細、SSL/TLS情報などを確認できます。デバッグの強力な味方です。
  3. URLを確認する: URLの入力ミスはありませんか? プロトコル (http/https)、ホスト名、パスなどが正しいか再確認します。
  4. ネットワークを確認する: インターネットに接続できていますか? ターゲットのサーバーに ping は通りますか? ファイアウォールやプロキシの設定は正しいですか?
  5. サーバーの状態を確認する: アクセス先のサーバーは正常に稼働していますか? 指定したポートでリクエストを受け付けていますか? サービスが停止している可能性もあります。
  6. SSL/TLSの問題 ((35) エラー):
    • サーバー証明書が自己署名証明書であったり、有効期限切れであったりしませんか?
    • アクセス先のホスト名と証明書に記載されているドメイン名が一致していますか?
    • これらの検証を一時的に無効にする場合は -k オプションを使いますが、セキュリティリスクがあることを理解してください。
    • 企業のネットワークなどでは、プロキシがSSLインスペクションを行っていて、独自の証明書で通信を傍受している場合があります。その場合は企業のルート証明書を信頼ストアに追加するか、担当者に相談してください。
  7. プロキシの問題: プロキシが必要な環境なのに設定していない、または設定が間違っている場合は、接続エラーやタイムアウトが発生します。-x オプションを確認します。プロキシ認証が必要な場合は -U オプションも確認します。
  8. HTTPエラー ((22) エラーまたはエラー応答):
    • --fail を指定している場合は22エラーになります。指定していない場合は、サーバーが返したHTMLやJSONなどのエラー応答ボディが表示されます。
    • レスポンスヘッダー (-i または -v で確認) を見て、ステータスコード(404 Not Found, 500 Internal Server Error, 401 Unauthorizedなど)を確認します。
    • 401 Unauthorizedの場合は認証情報(-u, -H "Authorization: ...") が正しいか確認します。
    • 403 Forbiddenの場合はアクセス権限がない可能性があります。
    • 404 Not Foundは指定したURLにリソースが存在しないことを意味します。URLを再確認します。
    • 5xx系のエラーはサーバー側の問題である可能性が高いです。サーバー管理者に問い合わせるか、後で再試行します。
  9. タイムアウト ((28) エラー): サーバーの応答が遅すぎるか、処理に時間がかかっている可能性があります。ネットワーク速度やサーバー負荷を確認します。必要に応じて -m オプションでタイムアウト時間を長く設定することもできますが、根本的な解決にはなりません。
  10. ボディデータ/ヘッダーの指定間違い: POSTやPUTでデータを送信している場合、-d, -F, -T などのオプションの使い方、ファイルパス、データ形式(フォームデータ、JSONなど)が正しいか確認します。Content-Type ヘッダーは正しく指定されていますか? -v オプションで送信されたリクエストヘッダーとボディを確認すると間違いが見つかりやすいです。

これらのヒントを参考に、エラーの原因を特定し、適切な対応を取ってください。

10. まとめ

この記事では、コマンドラインツール curl、特にWindowsユーザー向けの curl.exe に焦点を当て、その基本的な使い方からHTTP通信の詳細、ファイル転送、さらには応用的なオプションやトラブルシューティングまで、幅広く解説しました。

curlは非常に多機能であり、この記事で紹介できたのはその機能のごく一部に過ぎません。しかし、HTTP GET/POST、ヘッダー操作、ボディデータの送信、ファイルダウンロードといった基本的な機能をマスターするだけでも、APIのテストやデバッグ、簡単な自動化など、日々の作業効率を大きく向上させることができます。

curlの学習は、Webの仕組み(HTTPプロトコル)への理解を深める上でも非常に役立ちます。-v オプションを使って実際の通信内容を観察することで、リクエストやレスポンスがどのように構成されているのかを具体的に知ることができます。

もしさらに深くcurlについて学びたい場合は、以下の公式ドキュメントが非常に詳細で網羅的です(英語ですが、強力な情報源です)。

この記事が、あなたがcurlを使い始めるための一助となり、コマンドラインからの通信操作に自信を持てるようになることを願っています。ぜひ実際に手を動かして、様々なオプションを試してみてください。

これで、あなたもcurlを使いこなす第一歩を踏み出せました!


コメントする

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

上部へスクロール