【问题标题】:How to remove the password from a log file in windows?如何从Windows的日志文件中删除密码?
【发布时间】:2010-10-14 13:45:30
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果您还没有这样做,请询问“其他程序”是否可以通过环境变量(或密码文件)而不是命令行参数接受密码。
  • @Vlad 有趣的想法。只有在所有程序都可以的情况下才能工作。

标签: windows logging scripting echo sanitization


【解决方案1】:

如果您可以使用 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

【讨论】:

  • 有趣的方法。不过我打算用 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\")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 2019-08-25
    • 1970-01-01
    • 2016-07-12
    相关资源
    最近更新 更多