2011-01-16 15 views

risposta

10

Aggiornamento 2015 13 dicembre: readline ha sostituito process.stdin e 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

Non è possibile verificare il valore. Se premi backspace o altro tocco che non è alfanumerico. –

+0

'require ('tty'). SetRawMode()' è deprecato. – Scruffy

5

Per fare questo ho trovato questo eccellente Google Group post

che contiene il seguente frammento:

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") non funziona più nelle versioni correnti di nodo – mikemaccana

3

Ecco la mia versione ottimizzato di Chiodatrice di dall'alto, aggiornato per ottenere un callback e per il nodo 0.8 utilizzo:

/** 
* 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

È possibile gestire il backspace con un'istruzione case aggiuntiva per "" u007F "'. Se la password fino a quel momento non è vuota, puoi usare 'process.stdout.write ('\ 033 [<1> D')' per spostare il cursore indietro di una colonna; dopodiché puoi scrivere uno spazio, quindi tornare indietro. –

+0

L'ho aggiornato per funzionare con backspace e unito con la risposta originale accettata e aggiunto un collegamento a un repository che ho intenzione di continuare a migliorare. – CoolAJ86

47

È possibile utilizzare il modulo read(divulgazione: scritto da me) per questo:

nella shell:

npm install read 

Poi, nel tuo 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 - Ho avuto qualche problema su google per questo modulo, quindi vi ho lasciato un link qui per vostra comodità. – paulolc

+1

Esiste una versione sincrona? – mpen

+1

@ Marco: come potrebbe esserci? stdin è un flusso e genera eventi. Gli eventi non possono essere elaborati se una funzione è in attesa di ritorno. – josh3736

Problemi correlati