如何使用exec在nodejs服务器中流式传输shell命令的输出

时间:2016-05-18 15:44:13

标签: linux node.js shell

我正在尝试在nodejs中编写一个简单的webserver,它可以在linux VM上执行任意shell命令。对此服务的要求是,输出应该在使用节点实时启动进程的控制台上以及在浏览器中打印。 到目前为止,我目前的代码在完成命令之前不会输出命令的标准输出。

如何解决此问题,以便在控制台和浏览器中获得实时流媒体输出?另外,我希望对于以非零状态代码退出的cmds,请求的状态代码为非200。

#!/usr/local/bin/node

var http = require('http'),
    url = require('url'),
    exec = require('child_process').exec;

var host = "127.0.0.1",
    port = "8080",
    thisServerUrl = "http://" + host + ":" + port;

http.createServer(function (req, res) {
  req.addListener('end', function () {

  });
  var parsedUrl = url.parse(req.url, true);
  var cmd = parsedUrl.query['cmd'];

  console.log("CMD to run is " + cmd)
  res.writeHead(200, {'Content-Type': 'text/plain'});

  if( cmd ) {
    var child = exec(cmd, function (error, stdout, stderr) {
      var result = '{"stdout":' + stdout + ',"stderr":"' + stderr + '","cmd":"' + cmd + '"}';
      res.end(result + '\n');
    });
  } else {
    var result = '{"stdout":"' + '' + '","stderr":"' + 'cmd is mandatory' + '","cmd":"' + cmd + '"}';
    res.end(result + '\n');
  }
}).listen(port, host);
console.log('Server running at ' + thisServerUrl );

0 个答案:

没有答案