提示用户

时间:2016-08-30 23:03:54

标签: node.js command-line child-process

我试图从使用node调用的.js文件中运行命令(aws configure)。我一直在使用child_process,它允许我执行命令或批处理文件。但是,当该文件通常会提示用户输入用户名和密码时,我无法进行该交互。

我尝试将process.stdin与节点一起使用,以便可能将节点用作用户输入的中间人,但我无法将这两者连接在一起。

如果有人有任何想法会很棒!

var spawn = require('child_process').spawn;
var mystdin = process.stdin;
var conf = spawn('aws configure', {input: mystdin, shell: true});

//When command returns
conf.stdout.on('data', function(data) {
    console.log('stdout: ' + data);

    //prompt for input
    mystdin.resume();
    mystdin.setEncoding('utf8');
    var util = require('util');

    mystdin.on('data', function (text) {
        //INSERT ANSWER HERE
        console.log('received data:', util.inspect(text));
        if (text === 'quit\n') {
            done();
        }
    });

    function done() {
        console.log('Now that process.stdin is paused, there is nothing more to do.');
        process.exit();
    }
});

conf.stderr.on('data', function(data) {
    console.log('stdout: ' + data);
});

conf.on('close', function(code) {
   console.log('child precess exited with code ' + code);
});

这只是我目前要走的路。如果有人有更好的建议,请告诉我!

由于

1 个答案:

答案 0 :(得分:0)

两个想法:首先,我认为参数应该在第二个参数中。第二,也许aws命令没有意识到它是一个交互式终端或什么的。您可以尝试使用这样的child_process,或者如果不起作用,请使用pty.js

var pty = require('pty.js');

var term = pty.spawn('aws', ['configure'], {
  name: 'xterm-color',
  cols: 80,
  rows: 30,
  cwd: process.env.HOME,
  env: process.env
});

term.on('data', function(data) {
  console.log(data);
});