curlコマンドのオプション

curlコマンドのオプション アイキャッチ
目次

はじめに

最近何故かcurlコマンドでWebサーバーの状態を確認したりする機会があったので、オプションをまとめます。普段使わないコマンドを急に使うと覚えていないので…
今回は、オプション一覧を増やしたのに加えて、「ヘッダーを確認したい」「POSTしたい」など用途別の実行例もまとめてみました。調べたいことから逆引きしてもらえればと思います。

※オプションの内容はcurlの公式マニュアル(https://curl.se/docs/manpage.html)で確認しています。例のURLは説明用のexample.comにしています。

コマンドの構文

curlコマンドの構文は下記です。

curl [オプション] [URL]

オプションは複数組み合わせて使えます。「-sS」のように1文字のオプションはまとめて書くこともできます。

curlコマンドのオプション一覧

よく使うオプションを一覧にしました。「URL」の部分は実際のURLに置き換えてください。

オプション説明例
-o, –output <file>指定したファイルにダウンロードしたデータを保存するcurl -o page.html URL
-O, –remote-nameダウンロードしたデータを、リモートサーバー上のファイル名と同じ名前で保存するcurl -O URL/file.tar.gz
-C, –continue-at <offset>途中から転送を再開する(「-C -」で自動判定)curl -C - -O URL
-I, –head指定したURLのヘッダー情報を取得する(HEADリクエスト)curl -I URL
-i, –includeレスポンスヘッダーも本文と一緒に表示するcurl -i URL
-s, –silent進捗やエラーメッセージを表示しないcurl -s URL
-S, –show-error-sと組み合わせて、エラーだけは表示するcurl -sS URL
-v, –verbosecurlの詳細な出力(送受信のヘッダーなど)を表示するcurl -v URL
-w, –write-out <format>転送後にステータスコードや時間などを表示するcurl -w '%{http_code}' URL
-H, –header <header>リクエストにヘッダーを付加するcurl -H 'Accept: application/json' URL
-A, –user-agent <name>User-Agentを指定するcurl -A 'MyClient/1.0' URL
-e, –referer <URL>リファラーを指定するcurl -e https://example.com/ URL
-X, –request <method>リクエストのメソッドを指定するcurl -X DELETE URL
-d, –data <data>POSTリクエストでデータを送信するcurl -d 'a=1&b=2' URL
–data-urlencode <data>URLエンコードしてデータを送信するcurl --data-urlencode 'q=日本語' URL
–json <data>JSONをPOSTする(Content-Typeなどを自動で付ける。curl 7.82.0以降)curl --json '{"a":1}' URL
-F, –form <name=content>multipart/form-dataで送信する(ファイルアップロード)curl -F 'file=@a.txt' URL
-G, –get-dのデータをクエリ文字列としてGETで送るcurl -G -d 'q=curl' URL
-T, –upload-file <file>ファイルをアップロードする(HTTPではPUT)curl -T a.txt URL/
-u, –user <user:password>認証情報を付加する(Basic認証など)curl -u user URL
-c, –cookie-jar <file>クッキー情報をファイルに保存するcurl -c cookie.txt URL
-b, –cookie <data|file>リクエストにクッキーを付加する(ファイルも指定可)curl -b cookie.txt URL
-L, –locationリダイレクトを追跡するcurl -L URL
–max-redirs <num>追跡するリダイレクトの最大回数を指定するcurl -L --max-redirs 5 URL
-k, –insecureSSL証明書の検証をスキップする(検証用途のみ)curl -k URL
-m, –max-time <seconds>転送全体の最大時間を指定するcurl -m 10 URL
–connect-timeout <seconds>接続までの最大時間を指定するcurl --connect-timeout 5 URL
–retry <num>一時的なエラーのときに再試行する回数を指定するcurl --retry 3 URL
-f, –failHTTPステータスが400以上のとき、本文を出さずにエラー(終了コード22)にするcurl -f URL
-x, –proxy <[protocol://]host[:port]>プロキシを経由するcurl -x http://proxy.example.com:8080 URL
–compressed圧縮されたレスポンスを要求し、展開して表示するcurl --compressed URL
curlコマンドのオプション一覧

用途別の実行例

ヘッダー情報を確認する

Webサーバーの状態を確認したいときに一番使うのがこれです。「-I」でヘッダーだけを取得できます。

curl -I https://example.com/

本文も一緒に見たいときは「-i」を使います。送ったリクエストのヘッダーまで見たいときは「-v」が便利です。

# レスポンスヘッダー+本文
curl -i https://example.com/

# 送受信の詳細を表示
curl -v https://example.com/

ステータスコードだけを表示する

死活確認などでステータスコードだけ欲しいときは、本文を「-o /dev/null」で捨てて、「-w」で表示します。

curl -s -o /dev/null -w '%{http_code}\n' https://example.com/

# 応答時間も一緒に見る
curl -s -o /dev/null -w '%{http_code} %{time_total}\n' https://example.com/

ファイルをダウンロードする

# 名前を付けて保存
curl -o sample.html https://example.com/

# サーバー上のファイル名のまま保存
curl -O https://example.com/files/sample.tar.gz

# 途中で切れたダウンロードを再開
curl -C - -O https://example.com/files/sample.tar.gz

リダイレクトを追跡する

curlはデフォルトではリダイレクトを追いかけません。httpからhttpsへの転送などを確認するときは「-L」を付けます。

curl -L https://example.com/

# 最後にたどり着いたURLを表示
curl -sL -o /dev/null -w '%{url_effective}\n' http://example.com/

POSTでデータを送信する

「-d」を付けると自動的にPOSTになります(Content-Typeはapplication/x-www-form-urlencoded)。

# フォーム形式で送信
curl -d 'name=sample&lang=ja' https://example.com/api

# JSONを送信
curl -H 'Content-Type: application/json' -d '{"name":"sample"}' https://example.com/api

# curl 7.82.0以降なら--jsonで短く書ける
curl --json '{"name":"sample"}' https://example.com/api

ファイルをフォームで送るときは「-F」、PUTやDELETEなど他のメソッドを使うときは「-X」で指定します。

curl -F 'file=@./sample.txt' https://example.com/upload

curl -X DELETE https://example.com/api/items/1

認証付きでアクセスする

Basic認証は「-u」で指定します。パスワードを省略するとプロンプトで聞かれるので、コマンド履歴に残したくないときはこちらがおすすめです。

# パスワードは対話的に入力
curl -u user https://example.com/private/

# トークンをヘッダーで渡す場合
curl -H 'Authorization: Bearer <トークン>' https://example.com/api

タイムアウトを設定する

応答がないサーバーに対して待ち続けないように、時間を区切っておくと安心です。「–connect-timeout」は接続まで、「-m」は転送全体の制限です。

curl --connect-timeout 5 -m 10 https://example.com/

# 失敗したら3回まで再試行
curl --retry 3 https://example.com/

スクリプトで使う

シェルスクリプトで使うときは「-f」でHTTPエラーを終了コードにし、「-sS」で進捗は消してエラーだけ表示するのがよくある組み合わせです。

if curl -fsS -o /dev/null https://example.com/; then
  echo "OK"
else
  echo "NG"
fi

クッキーを使う

# ログイン時のクッキーを保存
curl -c cookie.txt -d 'user=sample' https://example.com/login

# 保存したクッキーを付けてアクセス
curl -b cookie.txt https://example.com/mypage

おわりに

curlはオプションがとても多いので全部は覚えられないですが、「-I」「-v」「-L」「-w」あたりを覚えておくと、Webサーバーの状態確認はだいたいできると思います。
ここにないオプションは「curl –help all」や公式マニュアルで確認してみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

社内エンジニアとして、SREとセキュリティの仕事をしています。サーバーの構築や運用、クラウド環境の設計にも関わってきました。趣味はゲームと漫画・アニメ。

コメント

コメントする

目次