我以这种方式打印命令行参数:
static void LogParameters(string[] args)
{
Console.WriteLine("Command line parameters: {0}", string.Join(" ", args);
}
将打印-username=Scott -password=cafebabe -nofail
。但我想把它打印成:
-username=Scott -password=******* -nofail
如果此参数的password=
打印出星号,我该如何显示任何内容?
答案 0 :(得分:3)
我看到两种显而易见的方法:
我更喜欢第一个,使用LINQ:
var argsForLogging = args
.Select(arg => arg.StartsWith("-password=") ? "-password=(entered)" : arg);
Console.WriteLine("Command line parameters: {0}", string.Join(" ", argsForLogging));
它可能看起来不那么好,但它很容易阅读,并且没有正则表达式:)
P.S。可以使代码输出不是(entered)
,而是输入密码中的字母。但是,它仍会披露非常敏感的信息。
<强>更新强> 如果参数格式不严格,那么您需要考虑这一点 例如,如果它应该不区分大小写,那么您可能希望使用此方法:
var argsForLogging = args
.Select(arg => arg.Trim().StartsWith("-password=", true, CultureInfo.InvariantCulture)
? "-password=(entered)"
: arg);
Console.WriteLine("Command line parameters: {0}", string.Join(" ", argsForLogging));
答案 1 :(得分:1)
通常
String maskString = String.Empty;
String replaceString = "-password=";
foreach (var item in args)
{
if (item.IndexOf(replaceString) >= 0)
{
maskString += replaceString + "********* ";
}
else
{
maskString += item+" ";
}
}
Console.WriteLine("Command line parameters: {0}", maskString.TrimEnd());
或LinQ
var argsForLogging = args
.Select(arg => arg.StartsWith("-password=") ? "-password=*********" : arg);
Console.WriteLine("Command line parameters: {0}", string.Join(" ", argsForLogging));
答案 2 :(得分:1)
static void LogParameters(string[] args)
{
string msg = string.Empty;
foreach(var item in args)
{
var subParts = item.Split(new[] { '=' },
StringSplitOptions.RemoveEmptyEntries);
if (subParts[0] != "-password")
msg += item + " ";
else
msg += subParts[0] + "****** ";
}
Console.WriteLine("Command line parameters: {0}",msg.TrimEnd());
}