2011-01-16 11 views

Odpowiedz

10

Aktualizuj 2015 gru 13: readline zastąpił process.stdin i 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

Nie można zweryfikować wartość. Jeśli naciśniesz klawisz Backspace lub inne dotknięcie, który nie jest alfanumeryczny. –

+0

'require ('tty'). SetRawMode()' jest przestarzałe. – Scruffy

5

Aby to zrobić, znalazłem to doskonały Google Group post

który zawiera następujący fragment:

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

Uwaga process.binding („stdio”) nie działa w obecnej wersji węzła – mikemaccana

3

Oto moja manipulowane wersja gwoździarka na z góry, zaktualizowane, aby uzyskać zwrotnego oraz dla węzła 0,8 Zastosowanie:

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

Możesz obsługiwać backspace z dodatkową instrukcją case dla '" u007F "'. Jeśli dotychczasowe hasło nie jest puste, możesz użyć polecenia 'process.stdout.write ('\ 033 [<1> D')', aby przesunąć kursor o jedną kolumnę do tyłu; po tym możesz napisać spację, a następnie wrócić ponownie. –

+0

Zaktualizowałem to do pracy z backspace i połączyłem go z oryginalną, zaakceptowaną odpowiedzią i dodałem link do repo, które planuję dalej ulepszać. – CoolAJ86

47

można użyć modułu read(ujawnienie: napisany przeze mnie) w tym:

w swojej powłoce:

npm install read 

Następnie w 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 - Wystąpił problem z googlowaniem dla tego modułu, więc umieszczam tutaj link dla Twojej wygody. – paulolc

+1

Czy istnieje wersja synchroniczna? – mpen

+1

@ Mark: Jak to możliwe? stdin jest strumieniem i uruchamia zdarzenia. Zdarzenia nie mogą być przetworzone, jeśli funkcja oczekuje na powrót. – josh3736