カールで使用するためのjsonのbash varの置き換え

カールで使用するためのjsonのbash varの置き換え

(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。二重引用符で囲まれた変数の拡張だけを覚えておいてください。

関連情報