ekwong.cn

尔康的博客

0%

shell打印过滤敏感信息

在工作中经常需要写 shell 脚本,为了方便观察脚本执行情况,经常需要执行一些打印操作。在打印的文案中,可能带有一些敏感信息,例如用户账号、密码等。出于安全考虑,需要对一些敏感字符执行屏蔽。

这时候可以看到常见的方案:

把敏感信息写在一个变量集合中 $msg_array,在脚本执行结束逻辑,调用 sed命令对 log 文件进行一遍过滤。

这个方案在需要确保脚本能执行到 sed 的逻辑,若脚本提前退出或进程被杀死,敏感信息会留在 log 文件中,从而产生安全问题。

于是有另一个方案出现:

把打印 log 都调用相同的方法,在该方法中过滤敏感信息,打印过滤后的信息。

这里稍微使用了 eval 命令,实现了把敏感信息替换成 xxx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash

params="username,password"
msg_array=(${params//,/ })

function common_log(){
local msg=$1
echo "now we get msg $msg"
for s in ${msg_array[@]}
do
eval tmp="\$$s"
msg=${msg/$tmp/xxx}
done
echo $msg
}

username="Jack"
password="123"

msg="create user with name $username and password $password"

common_log "$msg"

执行以上脚本,将得到输出:

1
2
now we get msg create user with name Jack and password 123
create user with name xxx and password xxx