一般的な使い方
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ならば1
,HTTP/2ならば2
となる)json
:取得可能なすべての情報をjson形式で取得するlocal_ip
:送信元IPアドレスlocal_port
:送信元ポート番号method
:リクエストメソッドnum_connects
:新規コネクション数num_headers
:応答ヘッダーの数num_redirects
:リダイレクトした回数onerror
:onerror
以降はエラーが発生した場合のみ表示される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"
type
でContent-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) |
この記事は役に立ちましたか?
もし参考になりましたら、下記のボタンで教えてください。