cURL POSTネストされたJSONをcURL GETに渡す

cURL POSTネストされたJSONをcURL GETに渡す

シェルスクリプトpost.shに有効なPOSTリクエストがあります。

curl -s --location --request POST \
     --header 'Content-Type: application/json'. \
     --data '{"password": "'$(echo $PW)'"}'. \
     https://api-sec.path/managed-vault/login/myuser

以下を含むjsonを返します。"auth":{"client_token":"my.token"}

post.sh | jq .auth.client_token「my.token」を返します。

私はこれを独立して動作する別のGETリクエスト(get.sh)に渡したいと思います。

TOKEN=$(cat)

curl --location --request GET \
     --header 'X-Vault-Token: '$(echo $TOKEN)''
     https://api-sec.path/managed-secrets/myuser

TOKEN手動貼り付けの仕組み:get.sh sQ34my./toKeN//z

これは私のトークンが間違っていることを示すエラーを返します。

post.sh | jq .auth.client_token | get.sh

このパイプカール出力を修正する方法は?

ベストアンサー1

2つの別々のシェルスクリプトpost.shget.sh

#!/bin/sh

# This is post.sh

curl -s --location --request POST \
     --header 'Content-Type: application/json' \
     --data "$( jo password="$PW" )" \
     'https://api-sec.path/managed-vault/login/myuser'

ここではこれを使用してjoJSONペイロードを作成し、パスワードが正しくエンコードされていることを確認します。jqそれを使用するには、joコマンドを次のように置き換えます。

jq --arg password "$PW" -n '{ password: $password }'

シェル変数をJSONドキュメントに直接挿入しないでくださいPW。これを行うと、コード挿入の脆弱性が発生し、パスワード文字列を別々にエンコードする必要があります。

#!/bin/sh

# This is get.sh

token=$( ./post.sh | jq -r '.auth.client_token' )

curl --location --request GET \
     --header "X-Vault-Token: $token" \
     'https://api-sec.path/managed-secrets/myuser'

スクリプトget.shは呼び出しpost.sh(現在のディレクトリにあると仮定)し、応答でトークンを解析してtokenシェル変数に割り当てます。

get.sh必要に応じて、標準入力からトークンを読み取ることができます。以下は、トークンが1行で渡されると仮定します。

#!/bin/sh

# This is get.sh

if [ -t 0 ]; then
    printf 'Enter token: ' >&2
fi
IFS= read -r token

curl --location --request GET \
     --header "X-Vault-Token: $token" \
     'https://api-sec.path/managed-secrets/myuser'

スクリプトの標準入力が端末に直接接続されている場合、スクリプトはトークンの入力を求めます。それ以外の場合、メッセージは表示されません。

get.shこのバリエーションは次のように呼び出すことができます。

./post.sh | jq -r '.auth.client_token' | ./get.sh

コードにはいくつかの問題があります。

  1. 最初のスクリプトでは$PW引用符なしで使用してください。これは、パスワードがスペース、タブ、改行文字から複数の単語に分割されることを意味します。その後、各単語はファイル名のグロービングを経ます。スペースとファイル名のワイルドカード(たとえば、および)を含むパスワードを使用すると、問題が*発生する可能性があります。変数に関して、2番目のスクリプトでも同じ問題があります。[?TOKEN

  2. $(echo $variable)justの代わりにinを使用するのは$variableアンチパターンであり、いくつかの問題があります(引用符なしの変数拡張とechoバックスラッシュエスケープが含まれている場合は文字列の内容を変更する可能性があります)。

  3. 前述のように、JSON文書の構成方法は、パスワードに二重引用符やリテラルタブなどの文字が含まれている場合に文書形式を簡単に破ることができます。パスワードを正確に引用する必要があります。上記の両方の方法を紹介しました(便利なjoツールとjqすでに使用しているユーティリティを使用)。

  4. jqデフォルトでは、JSONでエンコードされた文字列が出力されます。トークンのインポートを呼び出すと、jq二重引用符セットを含むJSON文字列が取得されます。 ()オプションjqと組み合わせて使用​​すると、トークンをデコードされた文字列として取得できます。-r--raw-output

おすすめ記事