Pregunta

Tengo un script de implementación (.bat), parte de la cual requiere llamar a otros programas y el envío de una contraseña en la línea de comandos. Me conecto la salida del script de implementación en un archivo. El problema es que la contraseña se registra también. Necesito una manera de desinfectar este archivo de registro.

Una forma de hacerlo es no hacerse eco de la línea que contiene la contraseña, pero yo preferiría simplemente reemplazar la contraseña con otra cadena.

Esto se realiza en el servidor (Windows 2008), por lo que no puede simplemente instalar cygwin o similares. Pensé que el comando de Windows 'hallazgo' puede ayudar, pero lo mejor que puede hacer es omitir toda la línea con la opción '/ v'.

UPD: hizo una investigación, y creo PowerShell es el camino a seguir. La contraseña está en la variable de entorno, por lo que necesita necesidad de encontrar la manera de conseguir lo leyó y reemplazar.

¿Fue útil?

Solución 2

yo examinamos la opción PowerShell y después de conseguir más allá de la codificación, citas y algunas otras cuestiones, aquí está mi solución 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 línea se llama desde un archivo por lotes, como el último paso de la secuencia de comandos de implementación. Más temprano en la secuencia de comandos se establecen los valores para log_filename y contraseña.

Al descomponerlo:

La ejecución de un PowerShell desde un archivo por lotes:

powershell "& {...}"

Lectura en el archivo de registro:

(Get-Content $env:LOG_FILENAME)

Para cada línea, sustituya [expresiones regulares] :: de escape ($ env: CONTRASEÑA) con '######':

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

Escapar caracteres en la variable de entorno CONTRASEÑA que pueden ser interpretadas como expresiones regulares carácter reservado:

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

Guardar la salida a un nuevo archivo de registro con un .clean [fecha y hora] .log anexado al nombre original:.

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

Otros consejos

Si puede utilizar JavaScript, algo así como lo siguiente debería hacerlo:

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

que leerá su entrada estándar, reemplace las apariciones de la cadena "password =" seguido de cualquier número de caracteres no está en blanco con la cadena "password = desinfectado y escribir los resultados en la salida estándar. Se pueden ajustar la expresión regular rePassword y la cadena de reemplazo para satisfacer sus necesidades. Suponiendo que guardó esa secuencia de comandos como "sanitize.js", podría ejecutar desde un script por lotes de la siguiente manera:

cscript sanitize.js < logfile.log > logfile.sanitized
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top