如何从Windows中的日志文件中删除密码?

时间:2009-03-20 15:13:32

标签: windows logging scripting echo sanitization

我有一个部署脚本(.bat),其中一部分需要调用其他程序并在命令行上发送密码。我将部署脚本的输出记录到文件中。问题是密码也会被记录。我需要一种清理此日志文件的方法。

这样做的一种方法是不回显包含密码的行,但我更愿意用另一个字符串替换密码。

这是在服务器上完成的(Windows 2008),所以我不能只安装cygwin等。我认为Windows'find'命令可能会有所帮助,但它能做的最好的事情是用'/ v'选项省略整行。

UPD:做了一些研究,我认为PowerShell是可行的方法。密码在环境变量中,因此需要弄清楚如何读取和替换。

2 个答案:

答案 0 :(得分:0)

如果您可以使用JavaScript,则应执行以下操作:

var rePassword = /password=\S+/g;
while (!WScript.StdIn.AtEndOfStream)
{
  WScript.StdOut.WriteLine(WScript.StdIn.ReadLine().replace(rePassword, 'password=sanitized'));
}

将读取其标准输入,替换任何出现的字符串“password =”,后跟任意数量的非空白字符,字符串为“password = sanitized”,并将结果写入标准输出。 您可以调整rePassword正则表达式和替换字符串以满足您的要求。 假设您将该脚本保存为“sanitize.js”,您可以按批处理脚本运行它,如下所示:

cscript sanitize.js < logfile.log > logfile.sanitized

答案 1 :(得分:0)

我仔细阅读了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\")