如何在nodejs控制台中隐藏密码?

 吴之薇_1989_l5g_112 发布于 2023-01-11 17:43

我想隐藏密码输入.我在stackoverflow中看到很多答案但是如果我按退格键我无法验证值.条件返回false.

我尝试了几种解决方案来覆盖这个功能,但是如果按下退格键,我遇到缓冲区的问题,我得到了隐形字符\b.

我按下:"A",退格,"B",我在缓冲区中有这个:"\ u0041\u0008\u0042"(toString()='A\bB')而不是"B".

我有 :

var readline = require('readline');

var rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

rl.question("password : ", function(password) {
    console.log("Your password : " + password);
});

小智.. 36

这可以通过读取线来处理,通过静音流拦截输出,如在npm(https://github.com/isaacs/read/blob/master/lib/read.js)上的读取项目中所做的那样:

var readline = require('readline');
var Writable = require('stream').Writable;

var mutableStdout = new Writable({
  write: function(chunk, encoding, callback) {
    if (!this.muted)
      process.stdout.write(chunk, encoding);
    callback();
  }
});

mutableStdout.muted = false;

var rl = readline.createInterface({
  input: process.stdin,
  output: mutableStdout,
  terminal: true
});

rl.question('Password: ', function(password) {
  console.log('\nPassword is ' + password);
  rl.close();
});

mutableStdout.muted = true;


A-312.. 26

覆盖应用程序的readline接口的_writeToOutput:https://github.com/nodejs/node/blob/v9.5.0/lib/readline.js#L291

要隐藏密码输入,您可以使用:

第一个解决方案:"密码:[= - ]"

当您按下触摸时,此解决方案具有动画:

password : [-=]
password : [=-]

代码 :

var readline = require('readline');

var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.stdoutMuted = true;

rl.query = "Password : ";
rl.question(rl.query, function(password) {
  console.log('\nPassword is ' + password);
  rl.close();
});

rl._writeToOutput = function _writeToOutput(stringToWrite) {
  if (rl.stdoutMuted)
    rl.output.write("\x1B[2K\x1B[200D"+rl.query+"["+((rl.line.length%2==1)?"=-":"-=")+"]");
  else
    rl.output.write(stringToWrite);
};

此序列"\ x1B [2K\x1BD"使用两个转义序列:

Esc [2K:清除整条线.

Esc D:向上移动/滚动窗口一行.

要了解更多信息,请阅读:http://ascii-table.com/ansi-escape-sequences-vt-100.php

第二个解决方案:"密码:****"

var readline = require('readline');

var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.stdoutMuted = true;

rl.question('Password: ', function(password) {
  console.log('\nPassword is ' + password);
  rl.close();
});

rl._writeToOutput = function _writeToOutput(stringToWrite) {
  if (rl.stdoutMuted)
    rl.output.write("*");
  else
    rl.output.write(stringToWrite);
};

您可以通过以下方式清除历

rl.history = rl.history.slice(1);

如果您使用严格模式更改'\ 033 [2K\033 [200D'到'\ x1B [2K\x1B [200D'.这只是将已弃用的八进制转义符更改为等效的十六进制转义符. (2认同)


estaples.. 7

您可以使用readline-sync模块而不是节点readline.

密码隐藏功能是通过它的"hideEchoBack"选项内置的.

https://www.npmjs.com/package/readline-sync

3 个回答
  • 这可以通过读取线来处理,通过静音流拦截输出,如在npm(https://github.com/isaacs/read/blob/master/lib/read.js)上的读取项目中所做的那样:

    var readline = require('readline');
    var Writable = require('stream').Writable;
    
    var mutableStdout = new Writable({
      write: function(chunk, encoding, callback) {
        if (!this.muted)
          process.stdout.write(chunk, encoding);
        callback();
      }
    });
    
    mutableStdout.muted = false;
    
    var rl = readline.createInterface({
      input: process.stdin,
      output: mutableStdout,
      terminal: true
    });
    
    rl.question('Password: ', function(password) {
      console.log('\nPassword is ' + password);
      rl.close();
    });
    
    mutableStdout.muted = true;
    

    2023-01-11 17:44 回答
  • 覆盖应用程序的readline接口的_writeToOutput:https://github.com/nodejs/node/blob/v9.5.0/lib/readline.js#L291

    要隐藏密码输入,您可以使用:

    第一个解决方案:"密码:[= - ]"

    当您按下触摸时,此解决方案具有动画:

    password : [-=]
    password : [=-]
    

    代码 :

    var readline = require('readline');
    
    var rl = readline.createInterface({
      input: process.stdin,
      output: process.stdout
    });
    
    rl.stdoutMuted = true;
    
    rl.query = "Password : ";
    rl.question(rl.query, function(password) {
      console.log('\nPassword is ' + password);
      rl.close();
    });
    
    rl._writeToOutput = function _writeToOutput(stringToWrite) {
      if (rl.stdoutMuted)
        rl.output.write("\x1B[2K\x1B[200D"+rl.query+"["+((rl.line.length%2==1)?"=-":"-=")+"]");
      else
        rl.output.write(stringToWrite);
    };
    

    此序列"\ x1B [2K\x1BD"使用两个转义序列:

    Esc [2K:清除整条线.

    Esc D:向上移动/滚动窗口一行.

    要了解更多信息,请阅读:http://ascii-table.com/ansi-escape-sequences-vt-100.php

    第二个解决方案:"密码:****"

    var readline = require('readline');
    
    var rl = readline.createInterface({
      input: process.stdin,
      output: process.stdout
    });
    
    rl.stdoutMuted = true;
    
    rl.question('Password: ', function(password) {
      console.log('\nPassword is ' + password);
      rl.close();
    });
    
    rl._writeToOutput = function _writeToOutput(stringToWrite) {
      if (rl.stdoutMuted)
        rl.output.write("*");
      else
        rl.output.write(stringToWrite);
    };
    

    您可以通过以下方式清除历

    rl.history = rl.history.slice(1);
    

    2023-01-11 17:44 回答
  • 您可以使用readline-sync模块而不是节点readline.

    密码隐藏功能是通过它的"hideEchoBack"选项内置的.

    https://www.npmjs.com/package/readline-sync

    2023-01-11 17:46 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有