Domanda

Ho uno script di distribuzione (bat), parte dei quali richiede di chiamare altri programmi e l'invio di una password sulla riga di comando. Annoto l'uscita del script di distribuzione in un file. Il problema è che la password viene registrato come bene. Ho bisogno di un modo di sanificazione questo file di registro.

Un modo per farlo è quello di eco non la linea che contiene la password, ma io preferirei sostituire solo la password con un'altra stringa.

Questo viene fatto su un server (Windows 2008), quindi non può semplicemente installare cygwin o simili. Ho pensato che il comando di Windows 'ritrovamento' può aiutare, ma il meglio che può fare è omettere tutta la linea con l'opzione '/ v'.

UPD: fatto qualche ricerca, e credo che PowerShell è la strada da percorrere. La password è nella variabile d'ambiente, quindi è necessario bisogno di capire come ottenere lo lesse e sostituire.

È stato utile?

Soluzione 2

I scandagliato l'opzione PowerShell e dopo aver passato la codifica, le citazioni e un paio di altre questioni, ecco la mia soluzione finale:

powershell "& {(Get-Content $env:LOG_FILENAME)|Foreach-Object {$_ -replace [regex]::escape($env:PASSWORD), '######'} | Set-Content ($env:LOG_FILENAME+\".clean.\"+(get-date).toString('yyyyMMddhhmmss')+\".log\")}"

Questa linea è chiamata da un file batch, come ultimo passaggio del script di distribuzione. In precedenza nello script vengono impostati i valori per log_filename e password.

scomponendola:

L'esecuzione di un PowerShell da un file batch:

powershell "& {...}"

di lettura nel file di registro:

(Get-Content $env:LOG_FILENAME)

Per ogni riga, sostituire [regex] :: escape ($ ENV: PASSWORD) con '######':

Foreach-Object {$_ -replace [regex]::escape($env:PASSWORD), '######'}

Escape qualsiasi carattere nella variabile d'ambiente PASSWORD che possono essere interpretate come espressione regolare carattere riservato:

[regex]::escape($env:PASSWORD)

Salva l'output in un nuovo file di log con un .Clean [timestamp] .log aggiunto al nome originale:.

Set-Content ($env:LOG_FILENAME+\".clean.\"+(get-date).toString('yyyyMMddhhmmss')+\".log\")

Altri suggerimenti

Se è possibile utilizzare JavaScript, qualcosa di simile alla seguente dovrebbe farlo:

var rePassword = /password=\S+/g;
while (!WScript.StdIn.AtEndOfStream)
{
  WScript.StdOut.WriteLine(WScript.StdIn.ReadLine().replace(rePassword, 'password=sanitized'));
}

che leggerà il suo standard input, sostituire eventuali occorrenze della stringa "password =" seguito da qualsiasi numero di caratteri non di spaziatura con la stringa "password = igienizzato e scrivere i risultati standard output. È possibile modificare l'espressione regolare rePassword e la stringa di sostituzione in base alle proprie esigenze. Supponendo che si è salvato script come "sanitize.js", è possibile eseguire da uno script batch come segue:

cscript sanitize.js < logfile.log > logfile.sanitized
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top