团队,我无法替换 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+G,password
密钥的值将自动编码为 JSON 字符串\"\"\"''\\\\\\!!\u0007
。
然后您可以将其与 一起使用curl
,只需记住双引号变量的扩展即可。