【问题标题】:Invoking OS commands on file from node/express从 node/express 对文件调用 OS 命令
【发布时间】:2018-07-24 23:13:38
【问题描述】:

我正在使用 Express 将文件上传到我的后端,如下面的代码所示。一旦他们,我想使用节点来调用一个操作这个文件的 shell 脚本。上传的文件将是 shell 脚本(./script.sh 文件)的参数,然后我想返回该脚本的标准输出。我正在苦苦挣扎的地方是弄清楚将代码放在哪里来做到这一点。它应该进入快速路线功能还是低于它?谁能告诉我如何做到这一点?

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);
};

【问题讨论】:

    标签: node.js express multer


    【解决方案1】:

    首先提醒一句,如果您正在接受用户输入并将其推送到直接进程中,尤其是在 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 脚本中执行此操作,您可能可以在 node 中执行您需要的大部分操作,除非您正在进行系统更改(这对于安全性来说也是一个坏主意)。

    【讨论】:

      猜你喜欢
      • 2021-08-15
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-23
      • 2014-07-30
      相关资源
      最近更新 更多