Bash 将JSON传递给aws secretsmanager时转义字符

Bash 将JSON传递给aws secretsmanager时转义字符,bash,escaping,jq,aws-cli,aws-secrets-manager,Bash,Escaping,Jq,Aws Cli,Aws Secrets Manager,我试图写一个脚本来更新AWS的秘密。是的,updatesecret命令已经执行了此操作,但这将覆盖现有机密,而不是将其与新内容合并 例如,假设my environment/my application/secrets具有以下内容: { "db_1_pwd": "secret"} 如果我运行脚本,如下所示: >> update_secret my-environment/my-application/secrets '{"db_2_pwd": "secreter"}' 我希望新内容

我试图写一个脚本来更新AWS的秘密。是的,
updatesecret
命令已经执行了此操作,但这将覆盖现有机密,而不是将其与新内容合并

例如,假设my environment/my application/secrets具有以下内容:

{ "db_1_pwd": "secret"}
如果我运行脚本,如下所示:

>> update_secret my-environment/my-application/secrets '{"db_2_pwd": "secreter"}'
我希望新内容是:

{ "db_1_pwd": "secret", "db_2_pwd": "secreter"}
取而代之的是,新内容最终是以下(未缩放)字符串:

这是我的剧本:

#!/bin/sh

SECRET_ID=$1
SECRET_STRING=$2

EXISTING_SECRET=`aws secretsmanager get-secret-value --secret-id $SECRET_ID | jq '.SecretString | fromjson'`
NEW_SECRET=`echo $EXISTING_SECRET $SECRET_STRING | jq  -s 'add tostring'`

echo $NEW_SECRET  # this is printed out for debug purposes

aws secretsmanager put-secret-value --secret-id $SECRET_ID --secret-string $NEW_SECRET
请注意,它确实会在echo语句中打印出
“{\”db\u 1\u pwd\”:“secret\”,“db\u 2\u pwd\”:“secreter\”}”
,如果我在命令行中键入:

>> aws secretsmanager put-secret-value --secret-id my-environment/my-application/secrets --secret-string "{\"db_1_pwd\":\"secret\",\"db_2_pwd\":\"secreter\"}"
它起作用了

很明显,脚本有问题,没有引号。有没有关于如何解决这个问题的建议


(这可能是用bash而不是AWS来完成的)

下面的脚本对我很有用:

#!/bin/sh

SECRET_ID=$1
SECRET_STRING=$2
EXISTING_SECRET=`aws secretsmanager get-secret-value --secret-id $SECRET_ID | jq '.SecretString | fromjson'`
NEW_SECRET=`echo "$EXISTING_SECRET $SECRET_STRING" | jq  -s add`
aws secretsmanager put-secret-value --secret-id $SECRET_ID --secret-string "$NEW_SECRET"

你的问题是什么?看起来像是你所有的works@Inian-我的剧本没用。它将my environment/my application/secrets设置为字符串:
“{db_1_pwd\”:“secret\”,“db_2_pwd\”:“secreter\”}
而不是将其设置为对象:
{“db_1_pwd:“secret”,“db_2_pwd:“secreter”}
@Philippe在下面的回答中用引号括住了
$NEW\u SECRET
。@Phippe-我尝试了许多不同的方法,但不知何故我一定没有尝试过。你的例子对我也适用。谢谢
#!/bin/sh

SECRET_ID=$1
SECRET_STRING=$2
EXISTING_SECRET=`aws secretsmanager get-secret-value --secret-id $SECRET_ID | jq '.SecretString | fromjson'`
NEW_SECRET=`echo "$EXISTING_SECRET $SECRET_STRING" | jq  -s add`
aws secretsmanager put-secret-value --secret-id $SECRET_ID --secret-string "$NEW_SECRET"