如何在Node.js中将shell命令的输出发送到客户端

时间:2018-03-17 13:14:35

标签: node.js express

我想将shell命令的输出发送给客户端。

以下是处理POST请求的代码段:

app.post('/', function(req, res) {

    console.log("request is received");
    const ps = spawn('sh', ['test.sh', req.body.code]);
    ps.stdout.on('data', (data) => {
        console.log(`stdout: ${data}`);
    });

    ps.stderr.on('data', (data) => {
        console.log(`stderr: ${data}`);
    });

    ps.on('close', (code) => {
        console.log(`child process exited with code ${code}`);
    });

    // echo incoming data to test whether POST request works
    res.status(200).json({ myReply: req.body.code });

});

在这种情况下如何将stdout发送给客户端?

2 个答案:

答案 0 :(得分:2)

您可以将子进程中的stdout流式传输回res。这是有效的,因为ps.stdout是可读流,res是可写流。

ps.stdout.pipe(res)

答案 1 :(得分:1)

首先应该注意的是,你要做的事情是危险的。非常危险。

盲目地从客户端执行命令并不明智,您应该清理不受信任来源的入口和出口数据。

虽然我确实假设根据您提供的示例没有发生这种情况,但我坚信您应该重新考虑您的设计(如果是这种情况)。

现在我已经发言了,您应该在stdout期间将on('data', (data) => {捕获到任何数组或对象,并将其发送到close上的客户端。

let results =[]; const ps = spawn('sh', ['test.sh', req.body.code]); ps.stdout.on('data', (data) => { console.log( stdout:$ {data}`);         results.push($ {数据});     });

ps.stderr.on('data', (data) => {
    console.log(`stderr: ${data}`);
});

ps.on('close', (code) => {
    console.log(`child process exited with code ${code}`);
    res.status(200).json(results);
});

// echo incoming data to test whether POST request works
res.status(200).json({ myReply: req.body.code });`