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

时间:2011-03-16 14:01:51

标签: java unix console-application

我正在编写一个提示输入passwd的命令行程序,我不希望它对密码字符进行本地回显。经过一些搜索,我偶然发现了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.");
    }
}

2 个答案:

答案 0 :(得分:0)

来自Java documentation页面:

  

如果System.console返回NULL,那么   不允许控制台操作,   或者因为操作系统不支持   他们或因为该计划是   以非交互式推出   环境。

问题很可能是因为使用管道不属于“交互”模式而使用输入文件将其用作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

但是,您提示的密码将保留在纯文本(尽管是隐藏的)文件中,直到命令终止。

答案 1 :(得分:0)

因此,出于某种原因,当System.console()返回null时,终端回显总是关闭,所以我的问题变得微不足道。以下代码完全按照我的意愿工作。感谢您的帮助。

import java.io.*;


public class PasswdPrompt {
    public static void main(String args[]) throws IOException{
        Console cons = System.console();
        char passwd[];
        if (cons == null) {
            // default to stderr; does NOT echo characters... not sure why
            System.err.print("Password: ");
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                                            System.in));
            passwd= reader.readLine().toCharArray();
        }
        else {
            passwd = cons.readPassword("Password: ");
        }
        System.err.println("Successfully got passwd.: " + String.valueOf(passwd));
    }

}