从节点/表达式中调用文件上的OS命令

时间:2018-07-24 15:00:38

标签: node.js express multer

我正在使用Express将文件上传到我的后端,如下面的代码所示。一旦创建了它们,我想使用node来调用操纵该文件的shell脚本。上传的文件将是shell脚本(./script.sh文件)的参数,然后我想为该脚本返回stdout。我在努力的地方正在弄清楚将代码放置在哪里。应该在快速路由功能中还是在其下方?谁能告诉我该怎么做?

const multer = require('multer')
const fs = require('fs')
const exec = require('child_process').exec

const upload = multer({
  dest: './upload',
  fileFilter: function (req, file, cb) {
      if (file.mimetype != 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') {
          return cb(new Error('Wrong file type'))
      }
      cb(null,true)
  }
}).single('file');

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

  console.log(res);
};

1 个答案:

答案 0 :(得分:0)

首先要警告一下,如果要接受用户输入并将其推入直接过程,尤其是在bash级别,则要非常小心。您最终可能会给某人很多访问您的服务器的权限!如果可以帮助的话,我通常建议不要这样做。现在已经解决了,让我们来谈谈Node。

如果这是一个快速过程,并且您想响应该过程是否成功,则可以将其放置在快速路由处理程序中。如果该进程长时间运行,则您可能希望立即做出响应,然后启动一个后台进程。这可以通过两种方式完成,一种是简单地启动异步过程而不等待其响应,另一种(也是更可靠的方式)是使用消息队列。将消息放入队列中,然后使工作进程从队列中消耗以处理作业。

如果您想直接执行此操作并使用shell进程的结果对其进行响应,那么您将执行以下操作。

app.post('/upload', upload, function(req, res) {
    const filePath = upload.path; // This may be the incorrect way to grab the path
    // Run the thing...
    exec("script.sh " + filePath, function(err, stdout, stderr) {
        // Handle errors and respond to the client...
        res.sendStatus(200);
    });
});

再次,我真的要敦促您考虑不要这样做,因为这会带来潜在的安全漏洞。很有可能,如果您可以在Shell脚本中执行此操作,则可能可以执行节点中所需的大部分操作,除非您要进行系统更改(这对安全性也是一个坏主意)。

相关问题