【发布时间】:2016-02-02 22:14:15
【问题描述】:
我目前正在为 git 开发我的 Web 界面。通过 child_process.spawn 访问 git 本身。虽然有简单的“命令 - > 响应”机制,但一切都很好,但我不明白我应该如何处理命令提示符(例如,git fetch 要求输入密码)。假设有一些事件被触发,但我不知道该听什么。我在 node.js 进程本身正在运行的命令行中看到的只是“git_user@myserver's password: _”。
将此请求重定向到我的 Web 应用程序会很棒,但它甚至可能吗?
我尝试在所有流(stdout、stdin、stderr)上收听message、data、pipe、end、close、readable,但没有人触发密码提示。
这是我的工作解决方案(未提及实验):
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'])。一直以来,我在 Web 界面上只看到加载屏幕,但如果我切换到运行节点脚本的命令行窗口,我会看到密码提示。现在让我们假设我无法将窗口切换到控制台,因为我在远程工作。
我想在我的网页界面上看到密码提示。例如,如果 child_process 在提示用户输入时会在child.stdin(或其他地方)上发出一些事件,这将很容易实现。在这种情况下,我会将字符串“来吧,伙计,git 想知道你的密码!在此处输入:_______”发送回 Web 客户端(response.end(str)),并将继续等待下一个带有客户端响应的 http 连接,包含所需的密码。然后只需 child.stdin.write(pass) 将其转至 git 进程。
这个解决方案可行吗?或者不涉及父进程的命令行。
更新2
刚刚尝试将侦听器附加到官方文档中描述的所有可能事件:stdout 和 stderr(可读、数据、结束、关闭、错误)、stdin(drain、finish、pipe、unpipe、error)、child(消息、退出、关闭、断开连接、消息)。
在将 git 流传递给它之后,在 process.stdout、process.stderr 上尝试了相同的侦听器。
密码请求没有任何反应...
【问题讨论】:
-
卡在同一个地方。您找到任何解决方案了吗? xkcd.com/979
-
@ShashankGoyal 不,很遗憾。仍在切换到我的终端以获取提示...
标签: node.js git stream child-process