使用node.js从input中获取密码

如何使用node.js从input中获取密码? 这意味着你不应该输出在控制台input的密码。

2015年12月13日更新: readline已经取代了process.stdin , node_stdio从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: '); 

您可以使用read模块(披露:我写的)为此:

在你的shell中:

 npm install read 

然后在你的JS中:

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

要做到这一点,我发现这个优秀的Google集团发布

其中包含以下代码段:

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

这里是我从上面的nailer的调整版本,更新得到一个callback和节点0.8使用:

 /** * 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; } }); }