如何从 Windows 日志文件中删除密码?
-
21-08-2019 - |
题
我有一个部署脚本(.bat),其中一部分需要调用其他程序并在命令行上发送密码。我将部署脚本的输出记录到文件中。问题是密码也会被记录。我需要一种清理该日志文件的方法。
一种方法是不回显包含密码的行,但我更愿意将密码替换为另一个字符串。
这是在服务器(Windows 2008)上完成的,所以我不能只安装 cygwin 之类的。我认为 Windows 的“查找”命令可能会有所帮助,但它最多只能省略带有“/v”选项的整行。
更新: 做了一些研究,我认为 PowerShell 是可行的方法。密码位于环境变量中,因此需要弄清楚如何读取并替换它。
解决方案 2
我仔细研究了 PowerShell 选项,在解决了编码、引号和其他一些问题之后,这是我的最终解决方案:
powershell "& {(Get-Content $env:LOG_FILENAME)|Foreach-Object {$_ -replace [regex]::escape($env:PASSWORD), '######'} | Set-Content ($env:LOG_FILENAME+\".clean.\"+(get-date).toString('yyyyMMddhhmmss')+\".log\")}"
该行是从批处理文件中调用的,作为部署脚本的最后一步。在脚本的前面,设置了 LOG_FILENAME 和 PASSWORD 的值。
分解一下:
从批处理文件执行 PowerShell:
powershell "& {...}"
读取日志文件:
(Get-Content $env:LOG_FILENAME)
对于每一行,将 [regex]::escape($env:PASSWORD) 替换为 '######':
Foreach-Object {$_ -replace [regex]::escape($env:PASSWORD), '######'}
对 PASSWORD 环境变量中可能被解释为正则表达式保留字符的任何字符进行转义:
[regex]::escape($env:PASSWORD)
将输出保存到新的日志文件,并在原始名称后附加 .clean.[timestamp].log:
Set-Content ($env:LOG_FILENAME+\".clean.\"+(get-date).toString('yyyyMMddhhmmss')+\".log\")
其他提示
如果您可以使用 JavaScript,则应该执行类似以下操作:
var rePassword = /password=\S+/g;
while (!WScript.StdIn.AtEndOfStream)
{
WScript.StdOut.WriteLine(WScript.StdIn.ReadLine().replace(rePassword, 'password=sanitized'));
}
这将读取其标准输入,用字符串“password=sanitized”替换任何出现的字符串“password=”,后跟任意数量的非空白字符,并将结果写入标准输出。您可以调整 rePassword 正则表达式和替换字符串以满足您的要求。假设您将该脚本保存为“sanitize.js”,您可以从批处理脚本运行它,如下所示:
cscript sanitize.js < logfile.log > logfile.sanitized