将密码参数值替换为 bash

Substituting password parameter value in bash

我在 Linux 框上有一个脚本 运行,它读取命令并在某些事件上调用程序。

我们需要记录这些命令,但是filter/substitute密码参数是通过连续输入五个X(XXXXX)来使用的。

输入示例

bash 脚本接收到的输入有一个命令类型,后跟各种参数,类似于这些示例:

基本格式为command parameter="" parameter=""...

记录值示例

以上值在日志中看起来像这样:

我试过的

我尝试使用 bash 替换,但在第一种情况下,我们没有引用密码(后来我们发现这将通过引号传递)。它会切断密码后的一切。第二个选项根本不做替换。

我觉得第二个选项很接近,但我遗漏了一些东西。如果有人可以指导我,将不胜感激。

我不喜欢 bash 替换,更喜欢使用 sed 来完成这样的任务。怎么样:

echo "$value"|sed 's/password="[^"]*"/password="XXXXX"/' >> somelog.log

?

是否需要在 bash 中本地执行此操作?

通过 sed 进行管道传输可能会更容易。但是,如果您想使用 bash,我建议您更改以 --password= 为前缀的任何内容,后跟任何非 space 的内容(因此它会捕获带引号和不带引号的密码)。我使用 // 以防需要在一行中使用多个 --password 实例。 extglob(扩展模式匹配)需要在您的脚本中打开才能工作。

shopt -s extglob
"${value//--password=+([! ])/--password=XXXXX }"

参考文献:
http://wiki.bash-hackers.org/syntax/pattern
http://wiki.bash-hackers.org/syntax/pe#search_and_replace

测试数据:

adduser --username="foo" --password="bar"
adduser --username="foo" --password=bar
remove --username="foo"
listusers
changepass --username="foo" --password="bar" --something="else"
changepass --username="foo" --password="bar" --something="else" --password="again"

变成:

adduser --username="foo" --password=XXXXX
adduser --username="foo" --password=XXXXX
remove --username="foo"
listusers
changepass --username="foo" --password=XXXXX  --something="else"
changepass --username="foo" --password=XXXXX  --something="else" --password=XXXXX 

编辑:我忘了提到为此需要激活 extglob。

Shell 替换扩展是模式而不是正则表达式。

使用 "${value/password=\"*\"/password=XXXXX}" 但请注意,尽管它似乎可以处理密码字符串中的转义引号,但它会很贪心(但您无法使用此方法避免这种情况)

如果您需要担心后面的参数,那么您需要使用其他东西(可以做正则表达式)。

类似于:

[[ "$f" =~ (.*password=)\"[^\"]*\"(.*) ]]; echo "${BASH_REMATCH[1]}XXXXX${BASH_REMATCH[2]}"

但这在转义引号方面存在问题(它会提前结束比赛)。

但 RSchulze 的回答更好。