1

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

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

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

UPD:做了一些研究,我认为 PowerShell 是要走的路。密码在环境变量中,所以需要弄清楚如何读取它并替换它。

4

2 回答 2

0

如果您可以使用 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
于 2009-03-25T16:39:41.327 回答
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\")
于 2009-04-01T14:51:47.820 回答