【问题标题】:How do I insert a bash variable into the JSON body of a cURL request?如何将 bash 变量插入 cURL 请求的 JSON 正文?
【发布时间】:2021-12-12 17:27:54
【问题描述】:

我正在尝试运行以下 cURL 命令(取自 ArgoCD documentation)。

$ curl $ARGOCD_SERVER/api/v1/session -d $'{"username":"admin","password":"password"}'

使用手动输入的正确凭据,它运行良好,但我将密码存储在环境变量 ($PASSWORD) 中,并且使用 '" 引号,它无法正确插入密码。

$ curl $ARGOCD_SERVER/api/v1/session -d $'{"username":"admin","password":"$PASSWORD"}'

我怀疑它使用字符串文字 $PASSWORD 作为实际密码,而不是变量的内容。 如何正确插入此变量?

【问题讨论】:

标签: bash curl


【解决方案1】:

像这样:

curl $ARGOCD_SERVER/api/v1/session -d '{"username":"admin","password":"'$PASSWORD'"}'

或者这个:

curl $ARGOCD_SERVER/api/v1/session -d "{\"username\":\"admin\",\"password\":\"$PASSWORD\"}"

这很可能也有效:

curl $ARGOCD_SERVER/api/v1/session -d "{'username':'admin','password':'$PASSWORD'}"

或:

printf -v data '{"username":"admin","password":"%s"}' "$PASSWORD"
curl $ARGOCD_SERVER/api/v1/session -d "$data"

【讨论】:

  • 在第一个中,您希望 '{...,"password":"'"$PASSWORD"'"}' 带有双引号变量。
  • 如果密码包含需要在 JSON 数据中转义的任何字符,这些将无法正常工作。使用像 jq 这样知道如何生成有效 JSON 的工具会更安全。
【解决方案2】:

您可以使用 创建 JSON:

json=$(jq -c -n --arg username admin --arg password "$password" '$ARGS.named')

curl $ARGOCD_SERVER/api/v1/session -d "$json"

使用 jq 可确保 JSON 格式正确,无论变量的内容如何:

$ password=$'with\'both"quotes'
$ declare -p password
declare -- password="with'both\"quotes"
$ jq -cn --arg username admin --arg password "$password" '$ARGS.named'
{"username":"admin","password":"with'both\"quotes"}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-30
    • 2021-11-18
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多