2012-05-30 25 views
47

Ich weiß, dass Befehlszeilenschnittstellen wie Git und andere in der Lage sind, Eingaben von einem Benutzer zu verbergen (nützlich für Kennwörter). Gibt es eine Möglichkeit dies programmatisch in Java zu tun? Ich nehme die Passworteingabe von einem Benutzer und möchte, dass ihre Eingabe in dieser bestimmten Zeile "versteckt" wird (aber nicht auf allen). Hier ist mein Code für es (obwohl ich bezweifle es hilfreich wäre, ...)Eingabe in der Befehlszeile ausblenden

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

Antwort

75

java.io.Console.readPassword Versuchen. 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(""); 
    } 

Beachten Sie jedoch, diese doesn't work mit der Eclipse-Konsole. Sie müssen das Programm von einer true Konsole/Shell/Terminal/Aufforderung ausführen, um es zu testen.

+21

+1 für mich wissen, es funktioniert nicht in Eclipse-Konsole (obwohl ich Netbeans verwenden, scheint es auch nicht in beiden). – kentcdodds

+1

Probe Übung: http://www.tutorialspoint.com/java/io/console_readpassword.htm – mavis

+3

funktioniert in den meisten IDEs nicht funktionieren, wie sie javaw verwenden. Siehe http://stackoverflow.com/a/26473083/3696510 – muttonUp

3

Es gibt:

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

source

aber ich glaube nicht, das mit einer IDE wie Eclipse funktioniert, weil das Programm als Hintergrundprozess ausgeführt wird, eher als ein Top-Level-Prozess mit einer Konsole Fenster.

Ein weiterer Ansatz ist die JPasswordField in Schwung mit der begleitenden actionPerformed Methode zu verwenden:

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

source

11

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

Sie können einen separaten Thread verwenden, um die wiedergegebenen Zeichen zu löschen und durch Sternchen zu ersetzen. Dies geschieht, um die EraserThread-Klasse gezeigt unten

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 Verwendung dieses Themas

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 in Details besprechen.

+1

http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain -links-woanders-wirklich-gut-antworten –

+0

Ich schaue mir diese Antwort an und mag die Passwort-Maskierung. Aber bitte geben Sie den Inhalt des Artikels an, den Sie für nützlich halten, um eine gute Antwort zu sein. – kentcdodds

+1

+1 für die Buchung des relevanten Codes. – kentcdodds

7

kann von Interesse sein. Neben der Maskierung von Zeichen werden Befehlszeilen-Vervollständigungs-, Bearbeitungs- und Protokollfunktionen bereitgestellt. Folglich ist es sehr nützlich für ein CLI-basiertes Java-Tool.

Ihre Eingabe zu maskieren:

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

Die Klasse Console eine Methode hat readPassword(), die Ihr Problem lösen könnte.

-2

Wenn Sie sich mit einem Java-Zeichen-Array (wie Passwort-Zeichen, die Sie von der Konsole lesen) zu tun, können Sie es auf eine JRuby Zeichenfolge mit dem folgenden Ruby-Code umwandeln können:

# 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}" 

Siehe auch "https://stackoverflow.com/a/27628738/4390019" und "https://stackoverflow.com/a/27628756/4390019"

Verwandte Themen