bash var 替换在 json 中以在curl中使用

bash var 替换在 json 中以在curl中使用

团队,我无法替换 json 中的值(myjson)以在curl 命令中使用。有什么提示吗?

JENKINS_USERNAME="svc-user"
JENKINS_USER_TOKEN="xxxx"
JENKINS_INSTANCE_FQDN="sham.blsm.comp.com"
INSTANCE="test-verify"
CREDENTIAL_ID_NAME="test"
USERNAME_KEY="tests"
USER_PASSWORD_KEY="testst"
ID_DESCRIPTION="asdfasdfasdf"
myjson=\''{ 
            "credentials": {
                "scope": "GLOBAL",
                "id": "'"${CREDENTIAL_ID_NAME}"'",
                "username": "'"${USERNAME_KEY}"'", 
                "password": "'"${USER_PASSWORD_KEY}"'",
                "description": "'"${ID_DESCRIPTION}"'",
                "\$class": "com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl"
            }
        }'\'
curl -X POST https://${JENKINS_USERNAME}:${JENKINS_USER_TOKEN}@${JENKINS_INSTANCE_FQDN}/${JENKINS_INSTANCE}/credentials/store/system/domain/_/createCredentials \
--data-urlencode ${myjson}

输出

curl -X POST https://${JENKINS_USERNAME}:${JENKINS_USER_TOKEN}@${JENKINS_INSTANCE_FQDN}/${JENKINS_INSTANCE}/credentials/store/system/domain/_/createCredentials \
--data-urlencode ${myjson}
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
curl: (3) URL using bad/illegal format or missing URL
curl: (3) unmatched brace in URL position 1:
{
 ^

下面的答案对我没有帮助 JSON 字符串中的 Bash 变量替换

答案1

单引号是命令行的一部分,而不是值的一部分。在curl 获取值之前,它们会在引号扩展中被删除,因此不要包含它们。

myjson='{ 
            "credentials": {
                "scope": "GLOBAL",
                "id": "'"${CREDENTIAL_ID_NAME}"'",
                "username": "'"${USERNAME_KEY}"'", 
                "password": "'"${USER_PASSWORD_KEY}"'",
                "description": "'"${ID_DESCRIPTION}"'",
                "$class": "com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl"
            }
        }'

(请注意,美元符号不需要在单引号中转义。)

如果你想防止分词,你需要双引号变量:

curl -X POST https://${JENKINS_USERNAME}:${JENKINS_USER_TOKEN}@${JENKINS_INSTANCE_FQDN}/${JENKINS_INSTANCE}/credentials/store/system/domain/_/createCredentials \
--data-urlencode "${myjson}"

请注意,这仅在没有变量包含双引号的情况下才有效。最好使用 JSON 感知工具来处理更复杂的情况,我建议学习

答案2

从一组 shell 变量创建 JSON 文档的最安全方法是使用jq.这可确保在需要时对每个字符串值进行适当编码(例如,如果密码包含双引号或反斜杠或需要在 JSON 中编码的其他字符)。

payload=$(
    jq -n \
        --arg scope GLOBAL \
        --arg id "$CREDENTIAL_ID_NAME" \
        --arg username "$USERNAME_KEY" \
        --arg password "$USER_PASSWORD_KEY" \
        --arg description "$ID_DESCRIPTION" \
        --arg '$class' com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl \
        '{ credentials: $ARGS.named }'
)

$ARGS.named--arg是一个 JSON 对象,包含命令行上定义的所有键+值(如果值已经是编码的 JSON 值,则jq使用)。--argjson

给定问题中显示的变量,这将创建一个payload具有以下内容的 shell 变量(jq与其-c选项一起使用以创建更紧凑的输出):

{
  "credentials": {
    "scope": "GLOBAL",
    "id": "test",
    "username": "tests",
    "password": "testst",
    "description": "asdfasdfasdf",
    "$class": "com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl"
  }
}

"""''\\\!!对于由 生成的字符串后跟不可见字符的用户密码Ctrl+Gpassword密钥的值将自动编码为 JSON 字符串\"\"\"''\\\\\\!!\u0007

然后您可以将其与 一起使用curl,只需记住双引号变量的扩展即可。

相关内容