Я использую этот довольно простой код для чтения пароля из консоли:
String s = new String(System.console().readPassword("Enter password:"));
Когда я запускаю это из команды примерно так:
$ java Foo
Enter password:
Все хорошо. Но если я перенаправлю стандартный вывод, я получу:
$ java Foo > /dev/null
Exception in thread "main" java.lang.NullPointerException
at Foo.main(Foo.java:122)
(строка 122 - та, что показана выше)
Странно, что перенаправление stdout
должно убить консоль, но я могу понять, почему это может происходить.
Вместо того, чтобы получить NPE, я бы хотел обойти это каким-то образом, но я не уверен, что в Java есть какие-либо другие средства, которые позволяют считывать чувствительные значения с клавиатуры, не отображая символы.
Существуют ли другие надежные стратегии? Я подозреваю, что смогу использовать экранирование ANSI, чтобы перевести терминал в определенный режим, но я не знаю, насколько надежными они могут быть из Java.