我通过它们的UUID从Vaulwarden实例获得json编码的秘密. 我希望这样循环遍历任何UUID并相应地设置环境变量.

每个字段都应该有变量(见下文)

uuid_USERNAME=username
uuid_PASSWORD=password
uuid_FIELD_fieldname=fieldvalue
...

Echo确实插入了单引号,以便脚本在设置这些基于字段的环境变量的for循环中中断.

有谁能给我一个如何处理这种情况的提示吗?

诚挚的问候!

以下是脚本:

#!/bin/bash
for item in 55f8864a-ec88-410c-ab0e-8bee2119042a
do
  entry='{"passwordHistory":[{"lastUsedDate":"2024-02-23T17:10:59.343Z","password":"versteckt_name-leerzeichen: versteckt_wert leerzeichen"},{"lastUsedDate":"2024-02-23T17:10:59.343Z","password":"TestPasswort"},{"lastUsedDate":"2024-02-23T16:45:56.662Z","password":"versteckt_name leerzeichen: versteckt_wert leerzeichen"},{"lastUsedDate":"2024-02-23T16:28:04.951Z","password":"versteckt_name: versteckt_wert"}],"revisionDate":"2024-02-23T17:14:48.810Z","creationDate":"2024-02-18T21:04:02.811Z","deletedDate":null,"object":"item","id":"55f8864a-ec88-410c-ab0e-8bee2119042a","organizationId":null,"folderId":null,"type":1,"reprompt":0,"name":"TestName","notes":"notizen notizen1 notizen2","favorite":false,"fields":[{"name":"benutzerdefiniert_name leerzeichen","value":"benutzerdefiniert_wert leerzeichen","type":0,"linkedId":null},{"name":"versteckt_name leerzeichen","value":"versteckt_wert leerzeichen","type":1,"linkedId":null},{"name":"bool_name leerzeichen","value":"false","type":2,"linkedId":null}],"login":{"fido2Credentials":[],"uris":[],"username":"TestBenutzername leerzeichen","password":"TestPasswort leerzeichen","totp":null,"passwordRevisionDate":"2024-02-23T17:10:59.343Z"},"collectionIds":[]}'
  echo $entry
  echo ${item}_USERNAME=$(echo ${entry} | jq -r ".login.username")  > GITHUB_ENV
  echo ${item}_PASSWORD=$(echo $entry | jq -r ".login.password")  >> GITHUB_ENV
  echo ${item}_NOTES=$(echo $entry | jq -r ".notes | select( . != null )") >> GITHUB_ENV
  for field in $(echo $entry | jq -cr .fields[])
  do
    echo $field
    field_name=$(echo $field | jq -r ".name" | sed -e "s/ /_/g")
    field_value=$(echo $field | jq -r ".value")
    echo ${item}_FIELD_${field_name}=${field_value} >> GITHUB_ENV
  done
done

以下是Pretty中的JSON:

{
  "passwordHistory": [
    {
      "lastUsedDate": "2024-02-23T17:10:59.343Z",
      "password": "versteckt_name-leerzeichen: versteckt_wert leerzeichen"
    },
    {
      "lastUsedDate": "2024-02-23T17:10:59.343Z",
      "password": "TestPasswort"
    },
    {
      "lastUsedDate": "2024-02-23T16:45:56.662Z",
      "password": "versteckt_name leerzeichen: versteckt_wert leerzeichen"
    },
    {
      "lastUsedDate": "2024-02-23T16:28:04.951Z",
      "password": "versteckt_name: versteckt_wert"
    }
  ],
  "revisionDate": "2024-02-23T17:14:48.810Z",
  "creationDate": "2024-02-18T21:04:02.811Z",
  "deletedDate": null,
  "object": "item",
  "id": "55f8864a-ec88-410c-ab0e-8bee2119042a",
  "organizationId": null,
  "folderId": null,
  "type": 1,
  "reprompt": 0,
  "name": "TestName",
  "notes": "notizen notizen1 notizen2",
  "favorite": false,
  "fields": [
    {
      "name": "benutzerdefiniert_name leerzeichen",
      "value": "benutzerdefiniert_wert leerzeichen",
      "type": 0,
      "linkedId": null
    },
    {
      "name": "versteckt_name leerzeichen",
      "value": "versteckt_wert leerzeichen",
      "type": 1,
      "linkedId": null
    },
    {
      "name": "bool_name leerzeichen",
      "value": "false",
      "type": 2,
      "linkedId": null
    }
  ],
  "login": {
    "fido2Credentials": [],
    "uris": [],
    "username": "TestBenutzername leerzeichen",
    "password": "TestPasswort leerzeichen",
    "totp": null,
    "passwordRevisionDate": "2024-02-23T17:10:59.343Z"
  },
  "collectionIds": []
}

以下是输出:

55f8864a-ec88-410c-ab0e-8bee2119042a_USERNAME=TestBenutzername leerzeichen
55f8864a-ec88-410c-ab0e-8bee2119042a_PASSWORD=TestPasswort leerzeichen
55f8864a-ec88-410c-ab0e-8bee2119042a_NOTES=notizen notizen1 notizen2
{"name":"benutzerdefiniert_name
jq: parse error: Unfinished string at EOF at line 2, column 0
jq: parse error: Unfinished string at EOF at line 2, column 0
55f8864a-ec88-410c-ab0e-8bee2119042a_FIELD_=
leerzeichen","value":"benutzerdefiniert_wert
jq: parse error: Invalid numeric literal at line 1, column 12
jq: parse error: Invalid numeric literal at line 1, column 12
55f8864a-ec88-410c-ab0e-8bee2119042a_FIELD_=
leerzeichen","type":0,"linkedId":null}
jq: parse error: Invalid numeric literal at line 1, column 12
jq: parse error: Invalid numeric literal at line 1, column 12
55f8864a-ec88-410c-ab0e-8bee2119042a_FIELD_=
{"name":"versteckt_name
jq: parse error: Unfinished string at EOF at line 2, column 0
jq: parse error: Unfinished string at EOF at line 2, column 0
55f8864a-ec88-410c-ab0e-8bee2119042a_FIELD_=
leerzeichen","value":"versteckt_wert
jq: parse error: Invalid numeric literal at line 1, column 12
jq: parse error: Invalid numeric literal at line 1, column 12
55f8864a-ec88-410c-ab0e-8bee2119042a_FIELD_=
leerzeichen","type":1,"linkedId":null}
jq: parse error: Invalid numeric literal at line 1, column 12
jq: parse error: Invalid numeric literal at line 1, column 12
55f8864a-ec88-410c-ab0e-8bee2119042a_FIELD_=
{"name":"bool_name
jq: parse error: Unfinished string at EOF at line 2, column 0
jq: parse error: Unfinished string at EOF at line 2, column 0
55f8864a-ec88-410c-ab0e-8bee2119042a_FIELD_=
leerzeichen","value":"false","type":2,"linkedId":null}
jq: parse error: Invalid numeric literal at line 1, column 12
jq: parse error: Invalid numeric literal at line 1, column 12
55f8864a-ec88-410c-ab0e-8bee2119042a_FIELD_=

我try 执行这个脚本,并try 了不同的方法,例如echo <<< $entry或将输出通过管道传输到文件中,然后对它们进行分类,但都没有起到作用.

变量应按照上述文本中所述进行设置.

推荐答案

您正在询问的问题是,当传递给for时,$(echo $entry | jq -cr .fields[])的输出被分成空格、制表符和换行符(假设IFS env var有其缺省值).您希望它只按换行符拆分.

解决这个问题的一个简单方法是改用read.

其他变化:

  • 修复了大量的注入错误.(仍然假设所有变量名称都有效.)
  • jq -cr '.fields[]'是错误的,因为您确实想要JSON.(谢天谢地,错误的-r被简单地忽略了.)
  • 不同的echo做不同的事情.最好在 playbook 中避免它,以避免意外.
  • 在JQ程序中用gsub( " "; "_" )替换了sed -e "s/ /_/g".
  • select( . != null )被替换为更短的values.

未修复:

  • $item包含破折号,这不适合作为变量名.
#!/usr/bin/bash

# to_shell_lit() - Creates a shell literal
# Usage: shell_lit="$( to_shell_lit "..." )"
to_shell_lit() {
   printf \'
   printf %s "$1" | sed "s/'/'\\\\''/g"
   printf \'
}

output_var() {
   printf '%s=%s\n' "$1" "$( to_shell_lit "$2" )"
}

exec >GITHUB_ENV

for item in 55f8864a-ec88-410c-ab0e-8bee2119042a; do
   entry='{"passwordHistory":[{"lastUsedDate":"2024-02-23T17:10:59.343Z","password":"versteckt_name-leerzeichen: versteckt_wert leerzeichen"},{"lastUsedDate":"2024-02-23T17:10:59.343Z","password":"TestPasswort"},{"lastUsedDate":"2024-02-23T16:45:56.662Z","password":"versteckt_name leerzeichen: versteckt_wert leerzeichen"},{"lastUsedDate":"2024-02-23T16:28:04.951Z","password":"versteckt_name: versteckt_wert"}],"revisionDate":"2024-02-23T17:14:48.810Z","creationDate":"2024-02-18T21:04:02.811Z","deletedDate":null,"object":"item","id":"55f8864a-ec88-410c-ab0e-8bee2119042a","organizationId":null,"folderId":null,"type":1,"reprompt":0,"name":"TestName","notes":"notizen notizen1 notizen2","favorite":false,"fields":[{"name":"benutzerdefiniert_name leerzeichen","value":"benutzerdefiniert_wert leerzeichen","type":0,"linkedId":null},{"name":"versteckt_name leerzeichen","value":"versteckt_wert leerzeichen","type":1,"linkedId":null},{"name":"bool_name leerzeichen","value":"false","type":2,"linkedId":null}],"login":{"fido2Credentials":[],"uris":[],"username":"TestBenutzername leerzeichen","password":"TestPasswort leerzeichen","totp":null,"passwordRevisionDate":"2024-02-23T17:10:59.343Z"},"collectionIds":[]}'

   output_var "${item}_USERNAME" "$( printf %s "$entry" | jq -r '.login.username' )"
   output_var "${item}_PASSWORD" "$( printf %s "$entry" | jq -r '.login.password' )"
   output_var "${item}_NOTES"    "$( printf %s "$entry" | jq -r '.notes | values' )"

   printf %s "$entry" | jq -c '.fields[]' | while read -r field; do
     field_name=$(  printf %s "$field" | jq -r '.name | gsub( " "; "_" )' )
     field_value=$( printf %s "$field" | jq -r '.value' )
     output_var "${item}_FIELD_${field_name}" "$field_value"
   done
done

输出:

55f8864a-ec88-410c-ab0e-8bee2119042a_USERNAME='TestBenutzername leerzeichen'
55f8864a-ec88-410c-ab0e-8bee2119042a_PASSWORD='TestPasswort leerzeichen'
55f8864a-ec88-410c-ab0e-8bee2119042a_NOTES='notizen notizen1 notizen2'
55f8864a-ec88-410c-ab0e-8bee2119042a_FIELD_benutzerdefiniert_name_leerzeichen='benutzerdefiniert_wert leerzeichen'
55f8864a-ec88-410c-ab0e-8bee2119042a_FIELD_versteckt_name_leerzeichen='versteckt_wert leerzeichen'
55f8864a-ec88-410c-ab0e-8bee2119042a_FIELD_bool_name_leerzeichen='false'

更好的是,只需在JQ中做所有事情.

#!/usr/bin/bash

exec >GITHUB_ENV

for item in 55f8864a-ec88-410c-ab0e-8bee2119042a; do
   entry='{"passwordHistory":[{"lastUsedDate":"2024-02-23T17:10:59.343Z","password":"versteckt_name-leerzeichen: versteckt_wert leerzeichen"},{"lastUsedDate":"2024-02-23T17:10:59.343Z","password":"TestPasswort"},{"lastUsedDate":"2024-02-23T16:45:56.662Z","password":"versteckt_name leerzeichen: versteckt_wert leerzeichen"},{"lastUsedDate":"2024-02-23T16:28:04.951Z","password":"versteckt_name: versteckt_wert"}],"revisionDate":"2024-02-23T17:14:48.810Z","creationDate":"2024-02-18T21:04:02.811Z","deletedDate":null,"object":"item","id":"55f8864a-ec88-410c-ab0e-8bee2119042a","organizationId":null,"folderId":null,"type":1,"reprompt":0,"name":"TestName","notes":"notizen notizen1 notizen2","favorite":false,"fields":[{"name":"benutzerdefiniert_name leerzeichen","value":"benutzerdefiniert_wert leerzeichen","type":0,"linkedId":null},{"name":"versteckt_name leerzeichen","value":"versteckt_wert leerzeichen","type":1,"linkedId":null},{"name":"bool_name leerzeichen","value":"false","type":2,"linkedId":null}],"login":{"fido2Credentials":[],"uris":[],"username":"TestBenutzername leerzeichen","password":"TestPasswort leerzeichen","totp":null,"passwordRevisionDate":"2024-02-23T17:10:59.343Z"},"collectionIds":[]}'

   printf %s "$entry" | jq -r --arg item "$item" '
      "\( $item )_USERNAME=\( .login.username | @sh )",
      "\( $item )_PASSWORD=\( .login.password | @sh )",
      "\( $item )_NOTES=\(    .notes // ""    | @sh )",
      (
         .fields[] |
         ( .name | gsub( " "; "_" ) ) as $field_name  |
         ( .value                   ) as $field_value |
         "\( $item )_FIELD_\( $field_name )=\( $field_value | @sh )"
      )
   '
done

输出:

55f8864a-ec88-410c-ab0e-8bee2119042a_USERNAME='TestBenutzername leerzeichen'
55f8864a-ec88-410c-ab0e-8bee2119042a_PASSWORD='TestPasswort leerzeichen'
55f8864a-ec88-410c-ab0e-8bee2119042a_NOTES='notizen notizen1 notizen2'
55f8864a-ec88-410c-ab0e-8bee2119042a_FIELD_benutzerdefiniert_name_leerzeichen='benutzerdefiniert_wert leerzeichen'
55f8864a-ec88-410c-ab0e-8bee2119042a_FIELD_versteckt_name_leerzeichen='versteckt_wert leerzeichen'
55f8864a-ec88-410c-ab0e-8bee2119042a_FIELD_bool_name_leerzeichen='false'

Json相关问答推荐

中间初始化的Jolt配置

Vega通孔信号中的动态梯度

如何在改装Android中将ResponseBody转换为JSONObject

如何将文件夹组织的.json文件合并为一个JSON文件,文件夹/文件名作为键

在Databricks中如何将JSON文件作为字典读取

基于JQ中另一个对象的值 Select 对象

在这种情况下我如何实现 UnmarshalJSON 并且只为一个接口字段定义特殊行为?

如何在 Apps 脚本中循环遍历 JSON 响应

golang递归json来构造?

修改 boost::json::object 中的值

Servicestack 返回数组而不是带有数组的对象

当值包含ansible中的字符串时解析json值

获取json中某个键的索引

可以通过 POST 使用 EventSource 传递参数的服务器发送事件 (SSE)

如何使用 Newtonsoft.Json 反序列化 JSON 数组

Swift :将 struct 转换为 JSON?

Sequelize - 如何仅返回数据库结果的 JSON 对象?

JSON JQ 如果没有 else

如何从 BindingResult 获取控制器中的错误文本

为什么 RestTemplate 不将响应表示绑定到 PagedResources?