2011-01-16 9 views

Respuesta

10

actualización 2015 Dic 13: readline ha sustituido process.stdin y node_stdio was removed from Node 0.5.10.

var BACKSPACE = String.fromCharCode(127); 


// Probably should use readline 
// https://nodejs.org/api/readline.html 
function getPassword(prompt, callback) { 
    if (prompt) { 
     process.stdout.write(prompt); 
    } 

    var stdin = process.stdin; 
    stdin.resume(); 
    stdin.setRawMode(true); 
    stdin.resume(); 
    stdin.setEncoding('utf8'); 

    var password = ''; 
    stdin.on('data', function (ch) { 
     ch = ch.toString('utf8'); 

     switch (ch) { 
     case "\n": 
     case "\r": 
     case "\u0004": 
      // They've finished typing their password 
      process.stdout.write('\n'); 
      stdin.setRawMode(false); 
      stdin.pause(); 
      callback(false, password); 
      break; 
     case "\u0003": 
      // Ctrl-C 
      callback(true); 
      break; 
     case BACKSPACE: 
      password = password.slice(0, password.length - 1); 
      process.stdout.clearLine(); 
      process.stdout.cursorTo(0); 
      process.stdout.write(prompt); 
      process.stdout.write(password.split('').map(function() { 
       return '*'; 
      }).join('')); 
      break; 
     default: 
      // More passsword characters 
      process.stdout.write('*'); 
      password += ch; 
      break; 
     } 
    }); 
} 

getPassword('Password: '); 
+0

No se puede comprobar el valor. Si presiona la tecla de retroceso u otro toque que no sea alfanumérico. –

+0

'require ('tty'). SetRawMode()' está en desuso. – Scruffy

5

Para ello he encontrado este excelente Google Group post

que contiene el siguiente fragmento:

var stdin = process.openStdin() 
    , stdio = process.binding("stdio") 
stdio.setRawMode() 

var password = "" 
stdin.on("data", function (c) { 
    c = c + "" 
    switch (c) { 
    case "\n": case "\r": case "\u0004": 
     stdio.setRawMode(false) 
     console.log("you entered: "+password) 
     stdin.pause() 
     break 
    case "\u0003": 
     process.exit() 
     break 
    default: 
     password += c 
     break 
    } 
}) 
+0

Nota process.binding ("stdio") ya no funciona en las versiones actuales de nodo – mikemaccana

3

aquí está mi versión modificada de la clavadora de desde arriba, actualizado para obtener una devolución de llamada y para el nodo 0.8 Uso:

/** 
* Get a password from stdin. 
* 
* Adapted from <http://stackoverflow.com/a/10357818/122384>. 
* 
* @param prompt {String} Optional prompt. Default 'Password: '. 
* @param callback {Function} `function (cancelled, password)` where 
*  `cancelled` is true if the user aborted (Ctrl+C). 
* 
* Limitations: Not sure if backspace is handled properly. 
*/ 
function getPassword(prompt, callback) { 
    if (callback === undefined) { 
     callback = prompt; 
     prompt = undefined; 
    } 
    if (prompt === undefined) { 
     prompt = 'Password: '; 
    } 
    if (prompt) { 
     process.stdout.write(prompt); 
    } 

    var stdin = process.stdin; 
    stdin.resume(); 
    stdin.setRawMode(true); 
    stdin.resume(); 
    stdin.setEncoding('utf8'); 

    var password = ''; 
    stdin.on('data', function (ch) { 
     ch = ch + ""; 

     switch (ch) { 
     case "\n": 
     case "\r": 
     case "\u0004": 
      // They've finished typing their password 
      process.stdout.write('\n'); 
      stdin.setRawMode(false); 
      stdin.pause(); 
      callback(false, password); 
      break; 
     case "\u0003": 
      // Ctrl-C 
      callback(true); 
      break; 
     default: 
      // More passsword characters 
      process.stdout.write('*'); 
      password += ch; 
      break; 
     } 
    }); 
} 
+0

Puede manejar el retroceso con una declaración de caso adicional para '" u007F "'. Si la contraseña hasta el momento no está vacía, puede usar 'process.stdout.write ('\ 033 [<1> D')' para mover el cursor hacia atrás una columna; después de eso puedes escribir un espacio y luego volver a moverlo. –

+0

Lo actualicé para trabajar con el retroceso y lo combiné con la respuesta original aceptada y agregué un enlace a un repositorio que planeo seguir mejorando. – CoolAJ86

47

Puede utilizar el read módulo (divulgación: escrito por mí) para esto:

En su shell:

npm install read 

Luego, en sus JS:

var read = require('read') 
read({ prompt: 'Password: ', silent: true }, function(er, password) { 
    console.log('Your password is: %s', password) 
}) 
+2

https://github.com/isaacs/read - Tuve algunos problemas para buscar en Google este módulo, así que le voy a dejar un enlace aquí para su conveniencia. – paulolc

+1

¿Hay una versión síncrona? – mpen

+1

@Mark: ¿cómo podría ser? stdin es una secuencia y dispara eventos. Los eventos no se pueden procesar si una función está esperando para regresar. – josh3736

Cuestiones relacionadas