シェルスクリプト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.sh
とget.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'
ここではこれを使用してjo
JSONペイロードを作成し、パスワードが正しくエンコードされていることを確認します。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
コードにはいくつかの問題があります。
最初のスクリプトでは
$PW
引用符なしで使用してください。これは、パスワードがスペース、タブ、改行文字から複数の単語に分割されることを意味します。その後、各単語はファイル名のグロービングを経ます。スペースとファイル名のワイルドカード(たとえば、および)を含むパスワードを使用すると、問題が*
発生する可能性があります。変数に関して、2番目のスクリプトでも同じ問題があります。[
?
TOKEN
$(echo $variable)
justの代わりにinを使用するのは$variable
アンチパターンであり、いくつかの問題があります(引用符なしの変数拡張とecho
バックスラッシュエスケープが含まれている場合は文字列の内容を変更する可能性があります)。前述のように、JSON文書の構成方法は、パスワードに二重引用符やリテラルタブなどの文字が含まれている場合に文書形式を簡単に破ることができます。パスワードを正確に引用する必要があります。上記の両方の方法を紹介しました(便利な
jo
ツールとjq
すでに使用しているユーティリティを使用)。jq
デフォルトでは、JSONでエンコードされた文字列が出力されます。トークンのインポートを呼び出すと、jq
二重引用符セットを含むJSON文字列が取得されます。 ()オプションjq
と組み合わせて使用すると、トークンをデコードされた文字列として取得できます。-r
--raw-output