vty tracer switch privilegiado password modo enable contraseñas contraseña consola configurar configuracion cambiar java security console passwords

java - switch - contraseñas cisco packet tracer



¿Cómo leer la contraseña desde la consola sin usar System.console()? (4)

Golpeé este error de eclipse , donde System.console() no está disponible para los lanzamientos de aplicaciones Java. Tengo una pequeña aplicación Java que también requiere que se ingrese una contraseña que solo se inicia desde el IDE. ¿Hay alguna otra forma de leer de forma segura una contraseña (es decir, no mostrarla en la consola) desde la consola usando solo clases JDK?

EDITAR:
Sé de System.in , pero eso muestra los caracteres ingresados ​​en la consola y por lo tanto no es seguro.

EDIT2:
También quiero señalar que uno puede crear un archivo por lotes en Windows o un pequeño script de bash en Linux / Unix en el proyecto. Al abrir este archivo en eclipse con el editor predeterminado del sistema, se iniciará en una nueva ventana de consola donde System.console() está disponible. De esta manera puedes iniciar la aplicación desde dentro de eclipse. pero el proyecto tiene que ser construido primero, para que existan los binarios.


Me encontré con el mismo problema. (Estimada comunidad de Eclipse: ¿Es tan difícil solucionar ese error?) Como todos los demás, necesito el IDE para dev / debug y un modo independiente para correr.

Así que escribí este método:

private static String readPwd() throws IOException { Console c=System.console(); if (c==null) { //IN ECLIPSE IDE System.out.print("Password: "); InputStream in=System.in; int max=50; byte[] b=new byte[max]; int l= in.read(b); l--;//last character is /n if (l>0) { byte[] e=new byte[l]; System.arraycopy(b,0, e, 0, l); return new String(e); } else { return null; } } else { //Outside Eclipse IDE return new String(c.readPassword("Password: ")); } }

La desventaja de esta solución es que en Eclipse verás la contraseña durante el tiempo de ejecución del programa.


Si System.console() devuelve un null , eso significa que no hay una consola utilizable en lo que respecta a Java.

  • No puede usar System.in porque es probable que no esté conectado a una consola.

  • Incluso si pudieras, no hay una forma portátil de desactivar el eco en Java.

  • Es posible que pueda usar Swing (o lo que sea) para abrir una ventana y pedir la contraseña, pero si el sistema no tiene ninguna función no funcionará.

Si está preparado para hacer cosas no portátiles, entonces (en Linux / UNIX) podría intentar abrir "/ dev / console" o "/ dev / tty". Y luego podrías usar termios para poner el controlador tty en modo noecho. Pero tendrás que hacer al menos algo de esto en código nativo.


Similar a la respuesta dada por @Pshemo, uno podría recurrir a Swing:

final String passwd; final String message = "Enter password"; if( System.console() == null ) { final JPasswordField pf = new JPasswordField(); passwd = JOptionPane.showConfirmDialog( null, pf, message, JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE ) == JOptionPane.OK_OPTION ? new String( pf.getPassword() ) : ""; } else passwd = new String( System.console().readPassword( "%s> ", message ) );


Tal vez en lugar de la consola intente usar el diálogo con JPasswordField . Aquí hay un ejemplo de http://blogger.ziesemer.com/2007/03/java-password-dialog.html .

final JPasswordField jpf = new JPasswordField(); JOptionPane jop = new JOptionPane(jpf, JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION); JDialog dialog = jop.createDialog("Password:"); dialog.addComponentListener(new ComponentAdapter() { @Override public void componentShown(ComponentEvent e) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { jpf.requestFocusInWindow(); } }); } }); dialog.setVisible(true); int result = (Integer) jop.getValue(); dialog.dispose(); char[] password = null; if (result == JOptionPane.OK_OPTION) { password = jpf.getPassword(); } if (password != null) System.out.println("your password: " + new String(password));