如何在windows中从日志文件中删除密码?

如何在windows中从日志文件中删除密码?,windows,logging,scripting,echo,sanitization,Windows,Logging,Scripting,Echo,Sanitization,我有一个部署脚本(.bat),其中一部分需要调用其他程序并在命令行上发送密码。我将部署脚本的输出记录到一个文件中。问题是密码也会被记录下来。我需要一种清理这个日志文件的方法 一种方法是不回显包含密码的行,但我更愿意用另一个字符串替换密码 这是在服务器(Windows2008)上完成的,所以我不能只安装cygwin或类似的软件。我认为Windows“find”命令可能会有所帮助,但它所能做的最好的事情是用“/v”选项省略整行 UPD:做了一些研究,我认为PowerShell是一个不错的选择。密码在

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

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

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


UPD:做了一些研究,我认为PowerShell是一个不错的选择。密码在环境变量中,因此需要弄清楚如何获取、读取和替换密码。

如果可以使用JavaScript,可以使用以下方法:

var rePassword = /password=\S+/g;
while (!WScript.StdIn.AtEndOfStream)
{
  WScript.StdOut.WriteLine(WScript.StdIn.ReadLine().replace(rePassword, 'password=sanitized'));
}
这将读取其标准输入,用字符串“password=”替换任何出现的字符串“password=”后跟任意数量的非空白字符,并将结果写入标准输出。 您可以调整rePassword正则表达式和替换字符串以满足您的需求。 假设您将该脚本保存为“sanitize.js”,则可以从批处理脚本运行它,如下所示:

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

我仔细阅读了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)替换为“####”:

转义PASSWORD环境变量中可能被解释为regex保留字符的任何字符:

[regex]::escape($env:PASSWORD)
将输出保存到带有.clean.[timestamp].日志的新日志文件,日志附加到原始名称:

Set-Content ($env:LOG_FILENAME+\".clean.\"+(get-date).toString('yyyyMMddhhmmss')+\".log\")

另外,如果您还没有这样做,请询问“其他程序”是否可以通过环境变量(或密码文件)而不是命令行参数接受密码。@Vlad有趣的想法。只有在所有程序都可以的情况下才有效。有趣的方法。不过,我将使用PowerShell进行尝试
Set-Content ($env:LOG_FILENAME+\".clean.\"+(get-date).toString('yyyyMMddhhmmss')+\".log\")