появилась потребность реализовать ввод логина/пароля в рамках лабораторной работы по защите информации. т.к. преподу абсолютно все равно - интегрирована защита в ОС (как я пытался изначально сделать, юзая корявые shell скрипты) или сделана в отдельном приложении (!), решил писать все лабораторные на java, эмулируя командную строку (изначально пугали необходимостью резидентов и проч. в лабе, а все сошлось к банальным приложениям на делфе. как обычно).
Начав делать ввод пароля, натолкнулся на интересные вещи - по запросу преподавателя нужны были “*” вместо пароля (плевать ему, что это не секьюрно и лучше вообще не светить количество символов в пароле). Если б без звездочек - пересобрал бы shadow или использовал бы кривой Console.getPassword(), но тут, бля, звездочки.
Тут оказалось, что в джаве нет поддержки по-символьного ввода и нет поддержки режима ввода без echo (под посимвольным вводом я понимаю реакцию метода read на нажатие кнопки в консоли. в джаве в стандартном режиме считать из консоли можно лишь по return). Гугл подсказал несколько workaround-ов и указал на этот баг 9-летней (!) давности (продолжил свою жизнь тут). Частично проблема исправлена в 1.6 классом Console, но криво (например, очень мне нравится код наподобие try {bla-bla} catch (IOException e) {}) и то создан только метод getPassword(), причем без поддержки echo/-echo режимов, а только полная аналогия никсового getpass().
Пришлось выкручиватся, т.к. лезть в swing принципиально не хотелось
Варианты решения проблемы:
Решил попробовать второй вариан - и он все-таки заработал, не очень красиво, но хитрость забавляет
Вот код:
p = Runtime.getRuntime().exec(new String[] {
"sh", "-c", "stty" +
(on ? " echo -cbreak" : " -echo cbreak") +
" < /dev/tty"});
p.waitFor();
т.е. на on == true включает echo и отключает cbreak, на false - наоборот.

Теперь осталось дописать подобие интерактивной консоли и можно парить сразу 3 лабы 