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.

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top