gpt4 book ai didi

java - System.console() 返回 null 时如何处理 java passwd 读取?

转载 作者:搜寻专家 更新时间:2023-11-01 00:58:24 24 4
gpt4 key购买 nike

我正在编写一个提示输入密码的命令行程序,但我不希望它对密码字符进行本地回显。经过一些搜索,我偶然发现了 System.console().readPassword(),这看起来很棒,除了在 Unix 中处理管道时。因此,我的示例程序(如下)在调用时运行良好:

% java PasswdPrompt

但是当我将它调用为 Console == null 时失败

% java PasswdPrompt | less

% java PasswdPrompt < inputfile

恕我直言,这似乎是一个 JVM 问题,但我不是唯一遇到此问题的人,因此我不得不想象有一些简单的解决方案。

有人吗?

提前致谢

import java.io.Console;

public class PasswdPrompt {
public static void main(String args[]) {
Console cons = System.console();
if (cons == null) {
System.err.println("Got null from System.console()!; exiting...");
System.exit(1);
}
char passwd[] = cons.readPassword("Password: ");
if (passwd == null) {
System.err.println("Got null from Console.readPassword()!; exiting...");
System.exit(1);
}
System.err.println("Successfully got passwd.");
}
}

最佳答案

来自 Java documentation页面:

If System.console returns NULL, then Console operations are not permitted, either because the OS doesn't support them or because the program was launched in a noninteractive environment.

问题很可能是因为使用管道脱离了“交互”模式并且使用输入文件将其用作 System.in,因此没有 Console

** 更新 **

这是一个快速修复。在 main 方法的末尾添加这些行:

if (args.length > 0) {
PrintStream out = null;
try {
out = new PrintStream(new FileOutputStream(args[0]));
out.print(passwd);
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (out != null) out.close();
}
}

然后调用您的应用程序

$ java PasswdPrompt .out.tmp; less .out.tmp; rm .out.tmp

但是,您提示的密码将驻留在明文(虽然隐藏)文件中,直到命令终止。

关于java - System.console() 返回 null 时如何处理 java passwd 读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5326406/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com