隐藏在命令行上输入隐藏在命令行上输入(Hide input on command line)

2019-05-16 17:48发布

我知道,像Git的命令行界面和其他人能够从(口令有用)的用户隐藏输入。 有没有办法来programmtically做到这一点在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();
}

Answer 1:

尝试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控制台。 你必须从一个真正的控制台/外壳/终端/提示能够测试运行程序。



Answer 2:

是可以做到的。 这就是所谓的命令行输入屏蔽。 您可以轻松地实现这一点。

你可以使用一个单独的线程中正在进入他们抹去呼应人物,并用星号代替他们。 这是使用如下所示的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("\010*");
     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;
   }
}

此链接详细讨论。



Answer 3:

的JLine 2可能会感兴趣的。 和字符屏蔽,它会提供的命令行完成,编辑和历史的设施。 因此它是一个基于命令行的Java工具是非常有用的。

为了掩盖你输入:

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


Answer 4:

有 :

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

资源

但我不认为这有工作像Eclipse的IDE,因为程序运行的后台进程,而不是一个控制台窗口的顶级工艺。

另一种方法是使用JPasswordField的摆动与随附actionPerformed方法:

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

资源



Answer 5:

该类控制台有一个方法readPassword()可能会解决您的问题。



文章来源: Hide input on command line