我想将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发送给客户端?
答案 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 });`