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