curlの使い方

一般的な使い方

WEBサイトにアクセスする

curlコマンドにURLを指定すると応答ボディを表示できます。

curl https://example.com

応答ヘッダだけ表示する

応答ヘッダだけ表示させたい場合は-Iオプションを使います。

curl -I https://example.com

応答ヘッダ+応答ボディを表示する

応答ヘッダに加えて応答ボディを表示させたい場合は-iオプションを使います。

curl -i https://example.com

送信ヘッダ+応答ヘッダ+応答ボディを表示する

送受信するすべての内容を表示させたい場合は-vオプションを使います。

curl -v https://example.com

証明書エラーを回避する

証明書エラーが発生しても応答を受け取りたい場合は-kオプションを使います。

curl -k https://example.com

リダイレクトを追跡する

curlはリダイレクトを受け取ってもリダイレクト先へアクセスしません。リダイレクトを受け取った際に引き続きリダイレクト先へアクセスしたい場合は-Lオプションを使います。

curl -L https://example.com

応答をファイルに書き込む

-oオプションを使うと応答ボディをファイルに保存できます。送受信ヘッダーはSTDERRに出力されるので保存されません。STDERRをファイルに保存したい場合は--stderrオプションを使う必要があります。

curl https://example.com -o file.txt

知っていると便利なオプション

セキュリティ関連オプション

--path-as-is

通常、curlで指定したURLは正規化されます。たとえば次のようなURL指定すると「../../」の箇所は「/」へ正規化されます。

curl https://example.com/../../

「../../」をそのまま送信したい場合に--path-as-isオプションを使います。

curl --path-as-is https://example.com/../../

このオプションを知っていると、脆弱性を探すときにBurpSuiteを使わなくてもこのようなURLを指定してcurlでアクセスすることができます。

設定関連オプション

-K, --config <config>

デフォルトの設定ファイルとは別に設定ファイルを読み込みたい場合はファイル名を指定して実行します。-K, --configオプションを使うと最初にデフォルト設定を読み込んだ後で指定するコンフィグを読み込みます。

curl https://example.com --config myconfig.txt

-q, --disable

デフォルトの設定ファイルを読み込みたくない場合はcurlの最初のパラメーターとして-q、--disableを付けます。curlコマンドの直後に-q, --disableでオプション指定する必要がある点に注意してください。

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

接続関連オプション

-k, --insecure

TLS、SFTP、SCP通信で安全性の検証をおこないません。HTTPS通信で証明書エラーが発生し接続できない場合はこのオプションをつけることで接続エラーを回避できます。

  • TLS:TLS証明書を検証しない
  • SFTP/SCP:known_hostsを検証しない

-x, --proxy [protocol://]host[:port]

プロキシサーバーを指定します。protocolを指定しない場合はHTTPとして扱われます。

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

SOCKSを使う場合は次のプロトコルを指定できます。

  • socks4
  • sock4a
  • socks5
  • sock5h

-U, --proxy-user <user:password>

プロキシ認証が必要な場合はuserとpasswordを指定して接続します。

curl https://example.com -x http://proxy.example.com:8080 -U taro:passw@rd

--tlsv1.x

TLSバージョンを指定してSSLネゴシエーションします。ライブラリでサポートされていないバージョンは指定できません。

  • --tlsv1.0
  • --tlsv1.1
  • --tlsv1.2
  • --tlsv1.3
curl https://example.com --tlsv1.3

表示関連オプション

-I, --head

HTTPヘッダーのみ取得して表示します。

-i, --include

応答ヘッダーと応答ボディを取得して表示します。

-v、--verbose

HTTP通信のデバッグに利用できる冗長モードです。動作中に表示される「>」「<」「*」で始まる行は以下のような意味です。

  • >:curlが送信したHTTPヘッダー
  • <:curlが受信したHTTPヘッダー
  • *:curlが提供する追加情報

-s、--silent

プログレスバーやエラーメッセージを表示させないサイレントモードです。

-S、--show-error

-s--silentオプション使用時にエラーメッセージを表示させたい場合は-S--show-errorオプションを追加します。

-w、--write-out <format>

フォーマットに従い変数を指定して値を出力させることができます。フォーマットをファイルから読み込ませたい場合はフ@ファイル名のような形式でファイル名を指定します。

curl https://example.com -w @formats.txt

ファイルでなく標準入力からフォーマットを読み込ませたい場合はファイル名を「-」にします。

echo "%{speed_download}\n" | curl https://example.com -w @-
フォーマット形式1:HTTPヘッダー名を指定する

%header{name}のように指定してHTTPヘッダーの値を出力します。nameの箇所はヘッダー名で大文字小文字の区別はありません。値がそのまま出力されるので適宜「\n」を追加するなどして改行させる必要があります。

curl https://example.com -w "%header{content-length}\n"
フォーマット形式2:変数名を指定する

変数名を%{val}のような形式で指定します(変数名はこちら)。値がそのまま出力されるので適宜「\n」を追加するなどして改行させる必要があります。

curl https://example.com -w '%{content_type}\n'
変数名一覧
  • content_type:「Content-Type」の内容
  • errormsg:curlが出力するエラーメッセージ
  • exitcode:curlの終了コード
  • filename_effective:-oオプションなどで指定しているファイル名
  • http_code:最後に取得したHTTP応答コード
  • http_connect:プロキシサーバーのCONNECTリクエストに対する応答コード
  • http_version:HTTPバージョン(HTTP/1.1ならば,HTTP/2ならばとなる)
  • json:取得可能なすべての情報をjson形式で取得する
  • local_ip:送信元IPアドレス
  • local_port:送信元ポート番号
  • method:リクエストメソッド
  • num_connects:新規コネクション数
  • num_headers:応答ヘッダーの数
  • num_redirects:リダイレクトした回数
  • onerroronerror以降はエラーが発生した場合のみ表示される
  • proxy_ssl_verify_result:プロキシサーバーのSSL証明書検証結果(成功時は0
  • redirect_url:リダイレクト先のURL(-L--Locationオプションを指定していない状態でリダイレクトが発生した場合のみ)
  • referer:リファラ
  • remote_ip:接続先IPアドレス(プロキシ接続の場合はプロキシサーバーのIPアドレス)
  • remote_port:接続先サポート番号(プロキシ接続の場合はプロキシサイバーのポート番号)
  • response_code:最後に取得したHTTP応答コード(http_codeと同じ)
  • scheme:URLスキーム(HTTP、FTPなどのプロトコル)
  • size_download:curlがダウンロードしたボディ/データのサイズ
  • size_header:ダウンロードしたヘッダーサイズ
  • size_upload:アップロードしたサイズ
  • speed_download:ダウンロード速度(秒間転送バイト数)
  • speed_upload:アップロード速度(秒間転送バイト数)
  • ssl_verify_result:SSL証明書検証結果(成功時は0
  • stderr%{stderr}以降はSTDERRに出力される
  • stdout%{stdout}以降はSTDOUTに出力される
  • time_appconnect:SSL/SSHハンドシェイクが完了するまでの時間
  • time_connect:リモートホストとのTCP接続が完了するまでの時間(プロキシを使っている場合はプロキシサーバーと接続するまでの時間)
  • time_pretransfer:開始からファイルが転送されるまでの時間
  • time_namelookup:名前解決が完了するまでの時間
  • time_redirect:リダイレクトに要した時間(複数のリダイレクトが発生した場合は最後のリダイレクト)
  • time_total:curlの開始から終了までに要した合計時間
onerrorについて

onerrorを指定すると、それ以降はエラーが発生した場合のみ表示されます。例えば、次の例では正常終了すると2つ目の%{http_code}は表示されず200//のように表示されます。

curl https://example.com -w '{http_code}/%{onerror}/%{http_code}\n'

タイムアウト関連オプション

--connect-timeout <fractional seconds>

接続完了までのタイムアウト値を設定します。接続後も考慮してタイムアウトを設定したい場合は-m, --max-timeオプションを使います。

curl https://example.com --connect-timeout 3

-m, --max-time <fractional seconds>

curlの処理全体のタイムアウト値を設定します。

curl https://example.com/download --max-time 300

リダイレクト関連オプション

-L, --location

サーバーからリダイレクトの応答があった場合、それに従ってリダイレクトします。資格情報は最初にアクセスしたホストへのみ送信し、リダイレクト先には送信しません。そのためリダイレクト先で資格情報が必要な場合はログインができなくなります。それを防ぐには--location-trustedオプションを追加する必要があります。

--max-redirs <num>

リダイレクトする回数の上限を設定します。初期設定では50回までリダイレクトします。無制限にリダイレクトさせたい場合は回数に「-1」を指定します。

curl https://example.com --max-redirs -1

--location-trusted

--location-trustedオプションを付けるとリダイレクト先に資格情報を送信できます。ただし、このオプションを使うと悪意のある別のサーバーに転送された場合に資格情報を盗まれるなどセキュリティ侵害につながる可能性があるので注意してください。

HTTP送信ヘッダー関連オプション

-A、--user-agent <name>

ユーザーエージェントを変更します。

curl https://example.com -A chrome

-e、--referer <url>

リファラとしてurlを送信します。

curl https://example.com -e https://www.example.com

-H, --header <header/@file>

HTTPリクエストを送信する際に追加のHTTPヘッダーを指定します。HTTPヘッダーは複数追加でき、curlの内部ヘッダーを指定した場合は指定したヘッダーで上書きされます。

curl https://example.com -H "User-Agent: Foo" -H "X-Forwarded-For: 127.0.0.1"

追加するヘッダーをファイルから読み込みたい場合は「@ファイル名」の形式で指定します。

curl https://example.com -H @header.txt

STDINから受け取る場合は「@-」のようにします。

echo "Foo: bar" | curl https://example.com -H @-

このオプションで追加したHTTPヘッダーはリダイレクト先にも追加されるため、ヘッダー値の機密性について注意を払ってください。

データ送信関連オプション

-d, --data <data>

WEBブラウザでHTMLフォームに入力して送信ボタンを押したときと同じ方法でデータをPOSTリクエストします。このオプションによってapplication/x-www-form-urlencodedを使用してデータをサーバーに送信します。

curl https://example.com/login -d "user=admin&password=Password"

以下のように2つに分けることもできます。

curl https://example.com/login -d "user=admin" -d "password=Password"

ファイルを送信したい場合は@ファイル名という形式で指定します。キャリッジリターンと改行が削除されて送信されます(そのまま送信するには--data-binaryを使います)。

curl https://example.com -d @postdata.txt

標準入力からデータを読み取りたい場合は@-のようにします。キャリッジリターンと改行が削除されて送信されます(そのまま送信するには--data-binaryを使います)。

cat postdata.txt | curl https://example.com -d @-

--data-ascii <data>

-d, --dataのエイリアスです。

--data-raw <data>

@を特別な文字として解釈させたくない場合に使います.それ以外は-d, --dataと同じです。

curl https://example.com --data-raw @foobar

--data-binary <data>

指定されたデータを加工せずそのまま送信します。キャリッジリターンや改行は削除されません。ファイルを送信したい場合は@ファイル名という形式で指定します。

curl https://example.com --data-binary @data.dat

標準入力からデータを読み取りたい場合は@-のようにします。

cat data.dat | curl https://example.com --data-binary @-

-F, --form <name=content>

HTTP プロトコル ファミリの場合、WEBブラウザでHTMLフォームに入力して送信ボタンを押したときと同じ方法でデータをPOSTリクエストします。このオプションによってmultipart/form-dataを使用してデータをサーバーに送信します。SMTP および IMAP プロトコルの場合、これは送信するマルチパート メール メッセージを作成します。

このオプションによってバイナリファイルのアップロードが可能になります。ファイルを送信する場合は@もしくは<を付けます。@<の違いは次の通りです。

  • @:アップロードファイルをバイナリファイルとして指定
  • <:アップロードファイルをテキストファイルとして指定
バイナリファイルの転送:
curl https://example.com -F "imgfile=@foo.jpg"
フィールドで値送信:
curl https://example.com -F "userid=123"
テキストファイルを送信:
curl https://example.com -F "somefile=<foo.txt"

typeContent-Typeを指定することもできます。

curl https://example.com -F "somefile=<foo.txt;type=text/plain"

--form-string <name=string>

-F, --formと同じですが、先頭の「@」や「<」、値内の「type」を単なる文字列として扱います。

curl https://example.com/ --form-string "imgfile=@foo.jpg"

ログ保存関連オプション

-o、--output <file>

応答ボディをfileに書き込みます。

シェルの展開機能({}[])を利用して一度に複数のURLにアクセスする場合は変数を利用できます。

たとえば次のコマンドを実行すると#1{www1,www2}を展開した内容に置き換えられて「file_www1.txt」と「file_www2.txt」というファイルに応答が記録されます。

curl https://{www1,www2}example.com -o "file_#1.txt"

展開箇所が複数の場合は#1に続いて#2も使えます。次の例では#2[1-10]の展開結果に置き換えられます。

curl https://{www1,www2}example[1-10].com -o "file_#1_#2.txt"

また、URLと-oオプションは複数指定できます。次の例ではexample.comの応答がfile1.txtに記録され、example.netの結果がfile2.txtに記録されます。

curl https://example.com https://example.net -o file1.txt -o file2.txt

--create-dirs

-o、--outputオプションを利用時、ファイル名に存在しないディレクトリ名が含まれている場合、ディレクトリを作成します。

curl https://example.com -o path/to/file.txt --create-dirs

-O、--remote-name

取得したURLのファイル名と同じファイル名で応答を記録します。以下の例ではローカルにfoo.htmlというファイル名で記録されます。

curl https://example.com/foo.html -O

-J, --remote-header-name

-O、--remote-nameオプション利用時、URLファイル名ではなくてサーバーが指定するContent-Dispositionのファイル名で記録します。

curl https://example.com/foo.html -OJ

--stderr <file>

STDERRへの出力をファイルに保存します。エラーメッセージだけでなくプログレスバーやヘッダー値もSTDERRに出力されるので、これらを保存する際に使用します。

curl https://example.com --stderr err-headers.txt -o body.txt

引数に「-」を指定するとSTDOUTに出力するので、送受信した内容をすべてひとつのファイルに保存したい場合は次のようにします。

curl https://example.com --stderr - -v > output.txt

プログレスバーが余計だと感じる場合は--silentを付けると良いでしょう。

curl https://example.com --stderr - -v --silent > output.txt

ちなみに上記のコマンドは以下のコマンドを実行した場合と同じ結果になります。

curl https://example.com -v --silent > output.txt 2>&1

Curl設定ファイル

curlで常に同じオプションを付けて実行するような場合、設定ファイルにオプションを記述しておくと楽です。

デフォルト設定のファイルパス検索

curlは最初に次のファイルパスを検索して設定ファイルを探します。

  • $CURL_HOME/.curlrc
  • $XDG_CONFIG_HOME/.curlr
  • $HOME/.curlrc

Windowsでは次のファイルパスを検索します。

  • %USERPROFILE%\.curlrc
  • %APPDATA%\.curlrc
  • %USERPROFILE%\Application Data\.curlrc

設定ファイル作成

コンフィグにはcurlで実行するときと同じように短いオプションと長いオプションの両方が使えます。長いオプションの場合は先頭の「--」を省略することができます。

また「#」で始まる行はコメントとみなされます。

# 証明書エラーを無視
--insecure
# 次のように「--」を省略することも可能
insecure

長いオプションの場合、パラーメータとの間は空白の他に「=」「:」が使えます。

user-agent Chrome
user-agent = Firerox
user-agent : Edge

パラメータに空白が含まれていたり、パラメータが「:」または「=」で始まる場合は引用符で囲む必要があります。二重引用符で囲むと次のエスケープシーケンスが利用できます。

  • \\
  • \"
  • \t
  • \n
  • \r
  • \v
user-agent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0"

curlで使われる環境変数

環境変数は大文字と小文字が使えますが、同じ環境変数名の場合は小文字が優先されます。

HTTP_PROXY [protocol://]<host>[:port]HTTP通信で使うプロキシ
HTTPS_PROXY [protocol://]<host>[:port]HTTPS通信で使うプロキシ
FTP_PROXY [protocol://]<host>[:port]FTP通信で使うプロキシ
FTPS_PROXY [protocol://]<host>[:port]FTPS通信で使うプロキシ
ALL_PROXY [protocol://]<host>[:port]プロトコル固有のプロキシ設定がされてない場合に使われるプロキシ
CURL_HOME <dir>ホームディレクトリ(優先度:1)
XDG_CONFIG_HOME <dir>ホームディレクトリ(優先度:2)
HOME <dir>ホームディレクトリ(優先度:3)

この記事は役に立ちましたか?

もし参考になりましたら、下記のボタンで教えてください。