Curl

將 cURL POST 嵌套 JSON 傳遞給 cURL GET

  • July 6, 2021

我在 shell 腳本 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

如何修復這個管道捲曲輸出?

您似乎想使用兩個單獨的 shell 腳本,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 }'

不要將 shell 變數PW直接注入 JSON 文件,因為這樣做會產生程式碼注入漏洞,並且還需要您單獨對密碼字元串進行編碼。

#!/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(假定位於目前目錄中),從響應中解析出令牌並將其分配給tokenshell 變數。

get.sh如果您願意,您仍然可以從標準輸入中讀取令牌。以下假設令牌在單行上傳遞:

#!/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未引用。這意味著密碼將在空格、製表符和換行符上分成多個單詞。然後每個單詞都會進行文件名通配。如果您使用帶有空格和文件名萬用字元(如*[和)的密碼,這將是一個問題?。關於TOKEN變數,您在第二個腳本中遇到了同樣的問題。
  2. $(echo $variable)代替 just是$variable一種反模式,有幾個問題(不帶引號的變數擴展以及echo如果字元串包含反斜杠轉義可能會修改字元串內容的事實)。
  3. 如前所述,如果密碼包含雙引號或文字製表符等字元,您建構 JSON 文件的方式可能很容易破壞文件的格式。您需要正確引用密碼,我已經展示了兩種方法上面(使用方便的jo工具和jq您已經在使用的實用程序)。
  4. jq預設情況下,將輸出 JSON 編碼的字元串。當您呼叫jq獲取令牌時,您會得到一個 JSON 字元串,其中包含一組雙引號。使用jq-r( --raw-output) 選項將確保您將令牌作為解碼字元串。

引用自:https://unix.stackexchange.com/questions/656462