如何使用bash脚本屏蔽存储在json文件中的密码

时间:2018-06-25 18:27:08

标签: json bash awk

我正在使用以下脚本屏蔽敏感数据。对于yml文件效果很好。

awk '
   BEGIN {
       IGNORECASE = 1
   }
   $1 ~ /^('${3}')$/ {
      gsub( /[^-]/, "X", $2 )
   }
  { print }
' "${1}" > "${2}"

我从java类中将source_file dest_file maskKeyword传递为命令,如下所示,但它不起作用。

 ./script.sh /abc/aa.json  /maskedaa.json   ‘"password":’

这是我的json文件的样子。

[
  {
    "username": "abc",
    "password": “cdgiN1n/nSQE="
  },
  {
    "username": "abc",
    "password": "QXiFTkgKft6PhfkfjLtCWQE="
  }
]

2 个答案:

答案 0 :(得分:3)

修复JSON(第4行的弯引号不正确,第9行的逗号不正确)之后,可以使用来完成

jq 'map(.password = "X")' aa.json

答案 1 :(得分:0)

我确实同意在这种情况下jq比awk更可取(下面有更多评论)。如果您知道JSON的印刷精美(每行只有一个条目),则可以使用正则表达式将行分成三部分。

awk -v field="${3}" '
  BEGIN {
    IGNORECASE = 1
    regex = sprintf("^([^\"]*\"%s\"[^:]*:[^\"]*\")([^\"]*)(\".*)$", field)
  }

  $0 ~ regex {
    before   = gensub(regex, "\\1", 1)
    password = gensub(regex, "\\2", 1)
    after    = gensub(regex, "\\3", 1)
    masked   = gensub(/./, "X", "g", password)
    printf("%s%s%s\n", before, masked, after)
    next
  } { print }' "${1}" > "${2}"

我编写的awk脚本仅与漂亮的打印行的三个组成部分匹配:

  1. [^\"]*\"%s\"[^:]*:[^\"]*\"将输入行与分号匹配。字段名称必须在双引号之间。
  2. [^\"]*:匹配条目的值
  3. \".*:匹配该字段以及逗号和其他字段的结尾双引号。

然后,该脚本会屏蔽密码,并用“ X”替换每个字符。最后,它将打印最终结果并跳过下一个块。

注意事项:

  • JSON必须打印精美或每行至少有一个密码字段
  • 密码字段必须是该行的第一个字段
  • 此脚本不支持在字段内使用转义的双引号
  • 此脚本仅适用于gnu awk(或gawk)

评论:如果必须具备可移植性,我会坚持使用jq解决方案,或者将jq烘焙到bash文件中。