我有一个部署脚本(.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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top