的NodeJS。 Child_process.spawn。处理进程的输入提示

时间:2015-11-02 21:49:23

标签: node.js git stream child-process

我目前正在使用git的web界面。通过child_process.spawn访问git本身。一切都很好,虽然有简单的“命令 - >响应”机制,但我无法理解我应该怎么做命令提示(git fetch要求输入密码)。假设有一些事件被解雇,但我不知道该听什么。我在命令行中看到的只是“git_user@myserver's password: _”,其中node.js进程本身正在运行。

将此请求重定向到我的Web应用程序会很棒,但它是否可能?

我试图在所有信息流(stdout)上监听messagedatapipeendclosereadable ,stdin,stderr),但没有人在密码提示时触发。

这是我的工作解决方案(没有提到实验):

var out="";
var err="";

var proc=spawn(exe,cmd);
proc.on("exit",function(exitCode){

});
proc.stdout.on("data",function(data){
    out+=data;
});
proc.stderr.on("data",function(data){
    err+=data;
});
proc.on("close",function(code){
    if(!code)func(out);
    else return errHandler(err);
});

你能帮我调查一下吗?

更新

当前情况:在我的GIT Web界面上有一个按钮“FETCH”(例如,对于简单的“git fetch”)。当我按下它时,会生成http请求并将其发送到http.createServer(callback).listen(8080)创建的node.js服务器。 callback函数接收我的请求并创建child_process.spawn('git',['-C','path/to/local/repo','fetch'])。这一次我只看到我的网络界面上的加载屏幕,但如果我切换到运行节点脚本的命令行窗口,我将看到密码提示。现在让我们假装我无法将窗口切换到控制台,因为我是远程工作的。

我想在我的网络界面上看到密码提示。例如,当提示用户输入时,child_process会在child.stdin(或其他地方)上发出一些事件,这将非常容易实现。在这种情况下,我会发送字符串“来吧,伙计,git想要知道你的密码!在这里输入:_______”回到web客户端(response.end(str)),并将继续等待下一个http连接客户端响应,包含所需的密码。然后只需child.stdin.write(pass)来git进程。

这个解决方案可行吗?或者不涉及父进程命令行的东西。

UPDATE2

试图将侦听器附加到官方文档中描述的所有可能事件:stdout和stderr(可读,数据,结束,关闭,错误),stdin(排放,完成,管道,管道,错误),子(消息,退出) ,关闭,断开连接,消息)。

在将git流传递给它之后,在process.stdout,process.stderr上尝试了相同的侦听器。

密码请求中没有任何内容......

2 个答案:

答案 0 :(得分:0)

你的代码无法工作的主要原因是因为你只知道你的Git进程在执行之后发生了什么。

使用spawn的主要原因是因为可以配置生成的进程,并且stdout和stderr是父进程中的可读流。

我刚尝试了这个代码,它的效果非常好。这是一个生成执行git push的进程的示例。但是,您可能知道git会询问您的用户名和密码。

var spawn = require('child_process').spawn;

var git = spawn('git', ['push', 'origin', 'master']);

git.stderr.on('data', function(data) {
  // do something with it
});

git.stderr.pipe(process.stderr);
git.stdout.pipe(process.stdout);
  1. 创建一个本地git repo并设置东西,以便您可以执行上述push命令。但是,你可以真正做任何git命令。
  2. 将其复制到名为git_process.js的文件中。
  3. 使用节点git_process.js
  4. 运行

答案 1 :(得分:0)

不知道这是否会有所帮助,但我发现拦截子进程提示的唯一方法是在生成新的子进程时将分离选项设置为true。

和我一样,我无法在interwebs节点上找到有关子进程提示的任何信息。有人会怀疑它应该转到stdout然后你必须写入stdin。如果我没记错的话,你可能会发现提示被发送到stderr。

对我而言,其他人无法解决这个问题。也许我们做错了。