1

配置スクリプト (.bat) があります。その一部では、他のプログラムを呼び出し、コマンド ラインでパスワードを送信する必要があります。デプロイ スクリプトの出力をファイルに記録します。問題は、パスワードもログに記録されることです。このログ ファイルをサニタイズする方法が必要です。

これを行う 1 つの方法は、パスワードを含む行をエコーし​​ないことですが、パスワードを別の文字列に置き換えることをお勧めします。

これはサーバー(Windows 2008)上で行われるため、cygwin などをそのままインストールすることはできません。Windows の「find」コマンドが役立つと思いましたが、「/v」オプションを使用して行全体を省略するのが最善です。

UPD:いくつかの調査を行いましたが、PowerShell が最適な方法だと思います。パスワードは環境変数にあるため、それを読み取って置き換える方法を理解する必要があります。

4

2 に答える 2

0

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
于 2009-03-25T16:39:41.327 に答える
0

私は 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\")
于 2009-04-01T14:51:47.820 に答える