Как обрабатывать чтение Java Passwd, когда System.console () возвращает ноль? - PullRequest
5 голосов
/ 16 марта 2011

Я пишу программу командной строки, которая запрашивает пароль, и я не хочу, чтобы он делал локальное эхо символов пароля.После некоторых поисков я наткнулся на 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 голосов
/ 18 марта 2011

Итак, по какой-то причине, когда 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));
    }

}
0 голосов
/ 16 марта 2011

Из страницы документации Java :

Если 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

Однако ваш пароль будет находиться в незашифрованном (хотя и скрытом) файле.пока команда не завершится.

...