作为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');
答案 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运行。