使用sudo

时间:2016-09-30 06:54:57

标签: javascript python node.js express child-process

作为Node.js的新手,我有这个问题..

我在一些地方看到它提到节点不应该以root身份运行,例如this。我只是使用node来设置简单 Web服务并执行需要root访问权限的python脚本。我只是不明白危险在哪里,就像 黑客所做的那样。

我的node.js文件是这样的: -

var http = require('http');
var express = require('express');

var app = express();


app.use(express['static'](__dirname));


app.get('/alert', function(req, res) {
    var addr = req.query.addr;
    //~ need to check if it is a valid address??
    console.log('Received addr -' + addr);

    var spawn = require('child_process').spawn;

    var process = spawn('python', ['custom-text-led/custom-text.py', addr]);

    process.stdout.on('data', function(data) {
        console.log('Data:' + data);
    });


})

app.get('*', function(req, res) {
    res.status(404).send('Unrecognized API call');
});

app.use(function(err, req, res, next) {
    if (req.xhr) {
        res.status(500).send('Opps, something went wrong');
    } else {
        next(err);
    }
});

app.listen(3000);

console.log('App server running at port 3000');

3 个答案:

答案 0 :(得分:1)

如果出现任何安全问题,黑客可以做任何事情。 您可以让运行Web服务器的用户获得执行您的任务打算执行的任务的权限。

一般情况下,尽量避免使用root(戴上锡箔帽)。

答案 1 :(得分:0)

根据superuser平台的StackExchange发来的this条帖子,您可以将password传递给其他sudo命令,如下所示:

echo <password> | sudo -S <command>

,根据this StackOverflow的帖子,您可以像这样在spawn中传递命令:

child.spawn('sh', args)
var args = ['-c', <the entire command you want to run as a string>];

几个小时后,我找到了解决方案。总结一下,您的答案将类似于:

import { spawn } from "child_process";
const process = spawn("sh", ["-c", "sudo -K << <password> <the entire command you want to run with sudo>"]);

我希望它能对您和像我这样的人有所帮助。

答案 2 :(得分:0)

以MajidJafari的工作为基础(不幸的是,当他输入时,该方法对我没有用),尽管有些令人费解,但我还是能够提出一些行之有效的方法。

const process = spawn("sh", ["-c", "echo <password used for sudo user> | sudo -S bash -c '<enter command or multiple commands separated by && here>'"]);

设置在单个括号“”中的所有命令将以sudo运行。