无法在 json 语法中用双引号传递 AWS CLI 命令

无法在 json 语法中用双引号传递 AWS CLI 命令

我正在使用下面的脚本,出现语法错误,因为无法从机密管理器获取凭据。 “用户名”:“我已输入的访问密钥的 AWS CLI 命令”,“密码”:“我已输入的密钥的 AWS CLI 命令”。如果有人能帮忙就太好了

#!/bin/bash

# Send the POST request and capture the response
response=$(curl -k \
-H "Content-Type: application/json" \
-X POST \
-d \
'{
"username":"'aws secretsmanager get-secret-value --region ap-south-1 --secret-id poc | jq --raw-output '.SecretString' | jq -r '.Access_Key''",
"password":"'aws secretsmanager get-secret-value --region ap-south-1 --secret-id poc | jq --raw-output '.SecretString' | jq -r '.Secret_Key''"
}' \
https://<region>/api/v1/authenticate)

答案1

我会做什么,使用 shell这里是文档:

#!/bin/bash

username=$(aws secretsmanager get-secret-value ... | jq '...')
password=$(aws secretsmanager get-secret-value ... | jq '...')
anotherVariable=foobar

# Send the POST request and capture the response
response=$(
    curl -k \
        -H "Content-Type: application/json" \
        https://<region>/api/v1/authenticate
        -d @/dev/stdin <<EOF
        {
            "username": $username,
            "password": $password,
            "anotherKey": "$anotherVariable"

        }
EOF
)

-X POST使用时不需要-d


如果你掌握了jq,也许选择@Kusalananda 答案,或者混合它们。如果没有,如果您不熟悉jq.

答案2

您在有效负载数据中引用时遇到问题,并且这些命令管道不会自动执行。

相反,请考虑首先准备 JSON 有效负载文档,然后curl使用准备好的数据进行调用:

#!/bin/sh

# Prepare JSON payload containing username and password.
payload=$(
        aws secretsmanager get-secret-value --region ap-south-1 --secret-id poc |
        jq '.SecretString | fromjson | {username: .Access_Key, password: .Secret_Key}'
)

# Submit the payload to the API and capture the response.
response=$(
        curl --silent \
                -H 'Content-Type: application/json' \
                -d "$payload" \
                "https://{{region}}/api/v1/authenticate"
)

这只需要一次aws+jq调用即可获取 AWS 凭证,因为jq可以一次性将多条数据提取到 JSON 对象中。键SecretString的值是一个嵌入的 JSON 对象,因此我们在访问嵌入字段之前在表达式fromjson中对其进行解码。jq

相关内容