Скрыть ввод в командной строке


Я знаю, что интерфейсы командной строки, такие как Git и другие способны скрыть ввод от пользователя (полезно для паролей). Есть ли способ программно сделать это в Java? Я принимаю ввод пароля от пользователя, и я хотел бы, чтобы их ввод был "скрыт" в этой конкретной строке (но не на всех из них). Вот мой код для этого (хотя я сомневаюсь, что это будет полезно...)

try (Scanner input = new Scanner(System.in)) {
  //I'm guessing it'd probably be some property you set on the scanner or System.in right here...
  System.out.print("Please input the password for " + name + ": ");
  password = input.nextLine();
}
6 54

6 ответов:

попробовать java.io.Console.readPassword. Вы должны будете работать по крайней мере Java 6, хотя.

   /**
    * Reads a password or passphrase from the console with echoing disabled
    *
    * @throws IOError
    *         If an I/O error occurs.
    *
    * @return  A character array containing the password or passphrase read
    *          from the console, not including any line-termination characters,
    *          or <tt>null</tt> if an end of stream has been reached.
    */
    public char[] readPassword() {
        return readPassword("");
    }

будьте осторожны, хотя, это не работает С помощью консоли Eclipse. Вы должны будете запустить программу из правда консоль / оболочка / терминал / запрос, чтобы иметь возможность проверить его.

да можно сделать. Это называется маскированием ввода из командной строки. Вы можете реализовать это легко.

вы можете использовать отдельный поток, чтобы стереть Эхо символов, как они вводятся, и заменяет их звездочками. Это делается с помощью класса EraserThread, показанного ниже

import java.io.*;

class EraserThread implements Runnable {
   private boolean stop;

   /**
    *@param The prompt displayed to the user
    */
   public EraserThread(String prompt) {
       System.out.print(prompt);
   }

   /**
    * Begin masking...display asterisks (*)
    */
   public void run () {
      stop = true;
      while (stop) {
         System.out.print("0*");
     try {
        Thread.currentThread().sleep(1);
         } catch(InterruptedException ie) {
            ie.printStackTrace();
         }
      }
   }

   /**
    * Instruct the thread to stop masking
    */
   public void stopMasking() {
      this.stop = false;
   }
}

С помощью этого потока

public class PasswordField {

   /**
    *@param prompt The prompt to display to the user
    *@return The password as entered by the user
    */
   public static String readPassword (String prompt) {
      EraserThread et = new EraserThread(prompt);
      Thread mask = new Thread(et);
      mask.start();

      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      String password = "";

      try {
         password = in.readLine();
      } catch (IOException ioe) {
        ioe.printStackTrace();
      }
      // stop masking
      et.stopMasking();
      // return the password entered by the user
      return password;
   }
}

Этой Ссылке обсудить в деталях.

JLine 2 может быть интересна. Помимо маскировки символов, он будет предоставлять средства завершения командной строки, редактирования и истории. Следовательно, это очень полезно для командной строки на основе инструментов Java.

маска ввода:

String password = new jline.ConsoleReader().readLine(new Character('*'));

есть :

Console cons;
char[] passwd;
if ((cons = System.console()) != null &&
    (passwd = cons.readPassword("[%s]", "Password:")) != null) {
    ...
    java.util.Arrays.fill(passwd, ' ');
}

источник

но я не думаю, что это работает с IDE, такой как Eclipse, потому что программа запускается как фоновый процесс, а не процесс верхнего уровня с консольным окном.

другой подход заключается в использовании JPasswordField в качели с сопровождающими actionPerformed способ:

public void actionPerformed(ActionEvent e) {
    ...
    char [] p = pwdField.getPassword();
}

источник

класс консоль метод readPassword() Это может решить вашу проблему.

Если вы имеете дело с массивом символов Java (например, символы пароля, которые Вы читаете с консоли), вы можете преобразовать его в строку JRuby со следующим кодом Ruby:

# GIST: "pw_from_console.rb" under "https://gist.github.com/drhuffman12"

jconsole = Java::java.lang.System.console()
password = jconsole.readPassword()
ruby_string = ''
password.to_a.each {|c| ruby_string << c.chr}

# .. do something with 'password' variable ..    
puts "password_chars: #{password_chars.inspect}"
puts "password_string: #{password_string}"

Смотрите также "https://stackoverflow.com/a/27628738/4390019 "и"https://stackoverflow.com/a/27628756/4390019"