Cómo obtener la contraseña de entrada utilizando node.js? Lo que significa que usted no debe de salida de la contraseña introducidos en la consola.

InformationsquelleAutor Alfred | 2011-01-16

4 Comentarios

  1. 13

    Actualización 2015 Dic 13: readline ha sustituido process.stdin y node_stdio fue retirado de Nodo 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: ');
    • Usted no puede verificar el valor. Si pulsa la tecla de retroceso o de otro contacto que no alfanuméricos.
    • require('tty').setRawMode() está en desuso.
  2. 54

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

    En su shell:

    npm install read

    A continuación, en su JS:

    var read = require('read')
    read({ prompt: 'Password: ', silent: true }, function(er, password) {
      console.log('Your password is: %s', password)
    })
    • github.com/isaacs/read – Tenía algunos problemas con el google para este módulo es así, me estoy cayendo de un enlace aquí para su conveniencia.
    • Hay una versión sincrónica?
    • Cómo podría haber? stdin es una secuencia de incendios y eventos. Los eventos no pueden ser procesados si la función está a la espera de regresar.
    • No sé, tal vez de la misma manera que readFileSync funciona??
    • no sincronizar, pero yo uso el módulo asíncrono.forEachSeries o asincrónica.siempre preguntar consecutivos de entrada de preguntas a través de async funciones.
    • cuando trato de depurar un script que se ejecuta en este código que no puedo averiguar qué tipo de dejarlo entrar en mi contraseña

  3. 5

    Para ello he encontrado esta excelente Un Grupo de Google de post

    Que contiene el siguiente fragmento de código:

    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
      }
    })
    • Nota de proceso.de unión(«stdio») ya no funciona en las versiones actuales de nodo
  4. 3

    Aquí está mi ajustado versión de la herramienta es desde arriba, actualizado a 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;
            }
        });
    }
    • Usted puede manejar la tecla de retroceso con un extra de instrucción case para "u007F". Si la contraseña hasta el momento no está vacía, puede utilizar process.stdout.write('\033[<1>D') para mover el cursor una columna; después de que usted puede escribir un espacio, a continuación, mueva de nuevo.
    • He actualizado este trabajo con la tecla de retroceso y se fusionó con el original aceptado respuesta y se ha añadido un enlace a un repositorio en la que tengo la intención de seguir mejorando.

Dejar respuesta

Please enter your comment!
Please enter your name here