【问题标题】:Parsing string with escape characters into JSON and to Variable in Bash [duplicate]将带有转义字符的字符串解析为 JSON 并解析为 Bash 中的变量 [重复]
【发布时间】:2021-12-02 20:45:10
【问题描述】:

问题:

我正在尝试从终端中的 AWS Secrets Manager 获取凭证,但是我想要的键和值需要采用 JSON 格式,但是由于引号,它们带有很多转义字符。

情景:

在我触发aws secretsmanager get-secret-value --secret-id snowflake-access-uat 命令后,我得到如下凭据:

{
    "ARN": "arn:aws:secretsmanager:ap-regionnm-1:111111111111:secret:my-secret",
    "Name": "snowflake-access-uat",
    "VersionId": "dont-care",
    "SecretString": "{\"sf-user\":\"USER_123_ADMIN\",\"sf-password\":\"FooBaarPassword\",\"sf-db\":\"MY_SPL_DB\",\"wh_name\":\"JOB_EXECUTOR\",\"sf-role\":\"JOB_EXECUTOR_ROLE\",\"sf-account\":\"icy-party\"}",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": 1627104812.142
}

但是,我只对 Secret String 感兴趣,为此我触发了 aws secretsmanager get-secret-value --secret-id snowflake-programmatic-access-uat | jq '.SecretString' 命令并收到了这个:

"{\"sf-user\":\"USER_123_ADMIN\",\"sf-password\":\"FooBaarPassword\",\"sf-db\":\"MY_SPL_DB\",\"wh_name\":\"JOB_EXECUTOR\",\"sf-role\":\"JOB_EXECUTOR_ROLE\",\"sf-account\":\"icy-party\"}"

但由于它有多个转义字符,我无法将它与jq 树一起使用。我试图从this link 获取参考,但我无法使其工作。此外,我需要将键和值作为 bash 会话中的变量。

注意:我不能使用任何第三方工具,因为我需要在 CodeBuild 上自动执行此操作(将选择运行时新实例)

【问题讨论】:

  • 您已经向我们展示并告诉我们 jq 已启用,因此我们处于一个很好的位置:“第三方工具”。
  • 虽然链接副本的标题仅询问双引号,但请求原始输出(如接受的答案指示)也会删除其他不需要的转义。
  • @CharlesDuffy 是的,查尔斯,CodeBuild 最近添加了 Ubuntu 系列,所以它确实有 jq,但我不太了解如何使用 Python 编写 buildspec.yml。
  • 所以,关于 YAML 要记住的是,所有 JSON 都是有效的 YAML
  • ...这样您就可以使用相同的数据编写一个 JSON 文件,将其命名为 buildspec.yml,然后您就设置好了。

标签: json bash parsing


【解决方案1】:

转义字符存在是因为您没有将-rjq '.SecretString' 一起使用。将其更改为jq -r '.SecretString',您的输出将改为:

{"sf-user":"USER_123_ADMIN","sf-password":"FooBaarPassword","sf-db":"MY_SPL_DB","wh_name":"JOB_EXECUTOR","sf-role":"JOB_EXECUTOR_ROLE","sf-account":"icy-party"}

...作为有效的 JSON,您可以反馈到 jq -r 以检索各个字段。

SecretStringJson=$(... | jq -r '.SecretString')
### one jq call per field isn't the most efficient possible way but it's easy
sfUser=$(jq -r '.["sf-user"]' <<<"$SecretStringJson")
sfDb=$(jq -r '.["sf-db"]' <<<"$SecretStringJson")
# ...etc

【讨论】:

    猜你喜欢
    • 2017-07-29
    • 1970-01-01
    • 2013-12-22
    • 2011-03-14
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多