Como remover a senha de um arquivo de log no Windows?
-
21-08-2019 - |
Pergunta
Eu tenho um script de implantação (.bat), parte da qual requer chamar outros programas e enviar uma senha na linha de comando. Eu registro a saída do script de implantação para um arquivo. O problema é que a senha é registrado também. Eu preciso de uma maneira de saneantes esse arquivo de log.
Uma maneira de fazer isso é não ecoar a linha que contém a senha, mas eu preferiria apenas substituir a senha com outra string.
Isto é feito no servidor (Windows 2008), então eu não pode simplesmente instalar o cygwin ou similar. Pensei comando do Windows 'achado' pode ajudar, mas o melhor que pode fazer é omitir a linha inteira com a opção '/ v'.
UPD: fiz alguma pesquisa, e eu acho que PowerShell é o caminho a percorrer. A senha é na variável de ambiente, por isso, necessidade necessidade de descobrir como conseguir lê-lo e substituir.
Solução 2
eu li a opção PowerShell e depois de obter passado a codificação, citações e algumas outras questões, aqui está a minha solução final:
powershell "& {(Get-Content $env:LOG_FILENAME)|Foreach-Object {$_ -replace [regex]::escape($env:PASSWORD), '######'} | Set-Content ($env:LOG_FILENAME+\".clean.\"+(get-date).toString('yyyyMMddhhmmss')+\".log\")}"
Esta linha é chamada a partir de um arquivo de lote, como a última etapa do script de implantação. No início do roteiro os valores para log_filename e senha estão definidos.
dividi-lo:
A execução de um PowerShell a partir de um arquivo de lote:
powershell "& {...}"
Leitura no arquivo de log:
(Get-Content $env:LOG_FILENAME)
Para cada linha, substitua [regex] :: escape ($ env: SENHA) com '######':
Foreach-Object {$_ -replace [regex]::escape($env:PASSWORD), '######'}
Fuga quaisquer caracteres na variável de ambiente senha, que pode ser interpretado como regex caráter reservado:
[regex]::escape($env:PASSWORD)
Save a saída para um novo arquivo de log com um .Limpar [timestamp] .log anexado ao nome original:.
Set-Content ($env:LOG_FILENAME+\".clean.\"+(get-date).toString('yyyyMMddhhmmss')+\".log\")
Outras dicas
Se você pode usar JavaScript, algo como o seguinte deve fazê-lo:
var rePassword = /password=\S+/g;
while (!WScript.StdIn.AtEndOfStream)
{
WScript.StdOut.WriteLine(WScript.StdIn.ReadLine().replace(rePassword, 'password=sanitized'));
}
Essa vai ler sua entrada padrão, substituir todas as ocorrências da cadeia "password =" seguido por qualquer número de caracteres não-espaço em branco com a senha string"= higienizados e escrever os resultados para a saída padrão. Você pode ajustar a expressão regular rePassword eo texto de substituição para atender às suas necessidades. Supondo que você salvou o script como "sanitize.js", você pode executá-lo a partir de um script de comandos da seguinte forma:
cscript sanitize.js < logfile.log > logfile.sanitized