Hide input on command line

后端 未结 5 1498
清酒与你
清酒与你 2020-11-27 16:08

I know that command line interfaces like Git and others are able to hide input from a user (useful for passwords). Is there a way to programmtically do this in Java? I\'m ta

相关标签:
5条回答
  • 2020-11-27 16:58

    Try java.io.Console.readPassword. You'll have to be running at least Java 6 though.

       /**
        * 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("");
        }
    

    Beware though, this doesn't work with the Eclipse console. You'll have to run the program from a true console/shell/terminal/prompt to be able to test it.

    0 讨论(0)
  • 2020-11-27 17:00

    JLine 2 may be of interest. As well as character masking, it'll provide command-line completion, editing and history facilities. Consequently it's very useful for a CLI-based Java tool.

    To mask your input:

    String password = new jline.ConsoleReader().readLine(new Character('*'));
    
    0 讨论(0)
  • 2020-11-27 17:10

    There is :

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

    source

    but I don't think this works with an IDE like Eclipse because the program is run as a background process rather than a top level process with a console window.

    Another approach is to use the JPasswordField in swing with the accompanying actionPerformed method:

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

    source

    0 讨论(0)
  • 2020-11-27 17:14

    Yes can be done. This is called Command-Line Input Masking. You can implement this easily.

    You can uses a separate thread to erase the echoed characters as they are being entered, and replaces them with asterisks. This is done using the EraserThread class shown below

    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("\010*");
         try {
            Thread.currentThread().sleep(1);
             } catch(InterruptedException ie) {
                ie.printStackTrace();
             }
          }
       }
    
       /**
        * Instruct the thread to stop masking
        */
       public void stopMasking() {
          this.stop = false;
       }
    }
    

    With using this thread

    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;
       }
    }
    

    This Link discuss in details.

    0 讨论(0)
  • 2020-11-27 17:14

    The class Console has a method readPassword() that might solve your problem.

    0 讨论(0)
提交回复
热议问题