(myjson)
チーム、curlコマンドで使用するjsonの値を変更することはできません。どのようなヒントがありますか?
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
一重引用符は値の一部ではなくコマンドラインの一部です。カールが値を取得する前に引用符拡張から削除されるため、含めないでください。
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
シェル変数セットから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
次の内容でシェル変数が生成されます(よりコンパクトな出力を生成するためにオプション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
。二重引用符で囲まれた変数の拡張だけを覚えておいてください。