的NodeJS。 Child_process.spawn。 处理进程“input提示

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

将这个请求redirect到我的web应用程序会很好,但这甚至有可能吗?

我试着听所有stream(stdout,stdin,stderr)的messagedatapipeendclosereadable ,但是没有人会在密码提示时触发。

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

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

你能帮我调查一下吗?

UPDATE

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

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

这个解决scheme可能吗? 或者不涉及父进程的命令行。

UPDATE2

只是尝试附加侦听器在官方文档中描述的所有可能的事件:stdout和stderr(可读,数据,结束,closures,错误),标准input(排水,完成,pipe道,unipe,错误),子(消息,退出,closures,断开,消息)。

尝试在process.stdout,process.stderrpipe道gitstream后,相同的听众。

什么都不会触发密码请求…

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

使用spawn的主要原因是生成的进程可以configuration,stdout和stderr是父进程中的可读stream。

我只是试了这个代码,它工作得很好。 这是一个产生一个执行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仓库,并设置一些东西,以便你可以执行上面的push命令。 但是,你真的可以做任何git命令。
  2. 将其复制到名为git_process.js的文件中。
  3. 使用节点git_process.js运行

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

像你一样,我找不到任何有关interwebs节点上的subprocess的提示信息。 有人会怀疑它应该去标准输出,然后你将不得不写信给标准input。 如果我没有记错,你可能会发现提示被发送到stderr。

对我来说有点令人惊讶,别人没有这个问题。 也许我们只是做错了。