はい、承知いたしました。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の公式サイトからバイナリをダウンロードしてインストールする必要があります。
- curl公式ダウンロードページにアクセスします: https://curl.se/download.html
- お使いのWindowsのアーキテクチャ(32-bitまたは64-bit)と、SSLライブラリ(通常はOpenSSL)を含むバージョンを選択します。
- zipファイルをダウンロードし、任意のフォルダに展開します。
- 展開したフォルダにある
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
This domain is for use in illustrative examples in documents. You may use this
domain in literature without prior coordination or asking for permission.
“`
これは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.txt
とfile2.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.com
のindex.html
とiana.org
のindex.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/headershttpbin.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¶m2=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¶m2=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/resourceBearerトークン認証 (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!