Curl

最終更新: 2021-08-13 12:16:55 +0800 +0800
tags: Curl | Http | Networking
原文は英語で書かれています。あなたはAI翻訳版を読んでいます。

curl は、順序付けられたコマンドラインで URL に対する転送を実行します。オプションで 1 つ以上の転送を構成し、各 URL が転送を開始します。多くのプロトコルをサポートしていますが、以下の例では、リクエストとレスポンスの制御方法が一般的な HTTP を使用します。

意図的にリクエストを構築する #

--request、--header、--data を使用してリクエストを明示します。別のメソッドを指定しない限り、--data は POST を選択します。--data-binary @file はファイルのバイト列を保持しますが、--data @file はフォーム指向の動作になります。

sh
curl --fail-with-body --show-error --silent \
  --request POST \
  --header 'Content-Type: application/json' \
  --header "Authorization: Bearer $token" \
  --data-binary @request.json \
  --output response.json \
  https://api.example.invalid/v1/jobs

可能な限り、認証情報をコマンド履歴に残さないでください。制限付きの設定ファイル、認証情報ヘルパー、またはサービスがサポートする認証メカニズムで使用される環境変数を利用します。一部のシステムでは、-u user:password によってプロセス一覧にパスワードが露出する可能性があります。

-L はリダイレクトに従います。メソッドや認証情報を別のオリジンに送信してはならない場合は、使用範囲を制限してください。自動化する前に --verbose でリダイレクトの動作を確認します。

複数の転送と URL グロブ #

curl はグローバルオプションと転送ごとのオプションを区別します。--verbose などのグローバルオプションは --next の後も維持されます。一方、--header、--request、--output などのローカルオプションは、--next で新しい操作が始まるとリセットされます。--next を使用しない場合、ローカルオプションは変更されるまで後続の各 URL に適用されるため、各リクエストに対して出力とヘッダーのセットを意図的に指定する必要があります。

sh
curl --output first.json https://example.invalid/one \
  --next --header 'Accept: text/plain' \
  --output second.txt https://example.invalid/two

シェルによる展開を防ぐため、URL グロブ構文は引用符で囲みます。curl は [] の範囲と {} のリストを展開します。--output 内の #1、#2、およびそれ以降のプレースホルダーは、対応するグロブ構成要素を参照します。

sh
curl 'https://example.invalid/page[1-3].json' --output 'page-#1.json'

リテラルの角括弧や波括弧が URL に含まれる場合は、--globoff を使用します。

転送経路を診断する #

リクエスト、レスポンス、プロキシ、TLS ネゴシエーションの詳細には --verbose を使用します。人間向けの出力を解析せずに、安定したタイミング情報とステータス情報を記録するには --write-out を使用します。

sh
curl --silent --show-error --output /dev/null \
  --write-out 'http=%{response_code} dns=%{time_namelookup} connect=%{time_connect} total=%{time_total}\n' \
  https://example.invalid/

--resolve host:port:address は、URL のホスト名と TLS SNI を保持したまま、特定のアドレスをテストします。--connect-to は、より一般的な方法で接続先を変更します。--proxy はプロキシを選択し、--noproxy はその使用からホストを除外します。証明書エラーの対策として --insecure を使用しないでください。URL、信頼チェーン、ホスト名、またはローカル CA 設定を修正します。

結果を再現可能な形で取得する #

--fail-with-body は、エラーレスポンスを保持したまま HTTP ステータスエラーを非ゼロにします。TCP 交換が成功しても HTTP リクエストが成功したとは限らないため、curl の終了ステータスを確認します。--retry は、再実行しても安全な転送にのみ使用します。べき等な GET の再試行と、決済用の POST の再実行は異なります。

アーティファクトを取得する場合は、ヘッダーと本文を別々に書き込み、完全な URL を固定し、タイミングメタデータを保存します。

sh
curl --fail --show-error --location \
  --dump-header artifact.headers \
  --output artifact.tar.xz \
  --write-out '%{url_effective} %{response_code}\n' \
  https://downloads.example.invalid/tool-1.2.3.tar.xz
sha256sum artifact.tar.xz

公開されたチェックサムまたは署名を検証してください。信頼できないダウンロードの後で生成したチェックサムは、受信したバイト列を記録しているだけです。

コメント

GitHub で閲覧・コメントする(投稿にはログインが必要です)