Как удалить пароль из файла журнала в Windows? - PullRequest
0 голосов
/ 20 марта 2009

У меня есть скрипт развертывания (.bat), часть которого требует вызова других программ и отправки пароля в командной строке. Я записываю вывод сценария развертывания в файл. Проблема в том, что пароль также регистрируется. Мне нужен способ очистки этого файла журнала.

Один из способов сделать это - не отображать строку, содержащую пароль, но я бы предпочел просто заменить пароль другой строкой.

Это делается на сервере (Windows 2008), поэтому я не могу просто установить Cygwin или тому подобное. Я думал, что команда Windows 'find' может помочь, но лучшее, что она может сделать, это опустить всю строку с опцией '/ v'.

UPD: Провел некоторые исследования, и я думаю, что PowerShell - это путь. Пароль находится в переменной окружения, поэтому нужно выяснить, как его прочитать и заменить.

Ответы [ 2 ]

0 голосов
/ 01 апреля 2009

Я просмотрел вариант 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\")
0 голосов
/ 25 марта 2009

Если вы можете использовать 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
...