it-swarm.com.de

Eingabe in der Befehlszeile ausblenden

Ich weiß, dass Befehlszeilenschnittstellen wie Git und andere Eingaben von einem Benutzer verbergen können (nützlich für Kennwörter). Gibt es eine Möglichkeit, dies in Java programmgesteuert durchzuführen? Ich nehme die Passworteingabe eines Benutzers an und möchte, dass dessen Eingabe in dieser bestimmten Zeile "verborgen" wird (aber nicht in allen). Hier ist mein Code dafür (obwohl ich bezweifle, dass er hilfreich wäre ...)

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();
}
57
kentcdodds

Versuchen Java.io.Console.readPassword . Sie müssen jedoch mindestens Java 6 ausführen.

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

Achtung, dies funktioniert nicht mit der Eclipse-Konsole. Sie müssen das Programm von einer echten Konsole/Shell/Terminal/Eingabeaufforderung ausführen, um es testen zu können.

85
adarshr

Ja kann getan werden. Dies wird als Befehlszeilen-Eingabemaskierung bezeichnet. Sie können dies einfach implementieren.

Sie können einen separaten Thread verwenden, um die zurückgegebenen Zeichen bei der Eingabe zu löschen und durch Sternchen zu ersetzen. Dies geschieht mit der unten gezeigten EraserThread-Klasse

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

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

Dieser Link ausführlich besprechen.

13

JLine 2 kann von Interesse sein. Neben der Zeichenmaskierung werden Funktionen zur Vervollständigung der Befehlszeile, zum Bearbeiten und zum Protokollieren bereitgestellt. Folglich ist es sehr nützlich für ein CLI-basiertes Java Tool.

So maskieren Sie Ihre Eingabe:

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

Es gibt :

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

Quelle

ich glaube jedoch nicht, dass dies mit einem IDE wie Eclipse funktioniert, da das Programm als Hintergrundprozess und nicht als Prozess der obersten Ebene mit einem Konsolenfenster ausgeführt wird.

Ein anderer Ansatz ist die Verwendung von JPasswordField in swing mit der dazugehörigen actionPerformed -Methode:

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

Quelle

3
Dhruv Gairola

Die Klasse Console hat eine Methode readPassword(), die möglicherweise Ihr Problem löst.

0
rlinden