【问题标题】:Running command from Node.js with sudo使用 sudo 从 Node.js 运行命令
【发布时间】:2017-02-08 16:08:51
【问题描述】:

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

我在一些地方看到它不应该以root身份运行节点,例如this。我只是使用 node 来设置 simple 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');

【问题讨论】:

  • 如果你不知道黑客能做什么,那并不意味着黑客什么也做不了。这仅意味着您不是黑客。这就是成为一名黑客的全部意义:当每个人都认为无能为力时,看看能做什么。

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


【解决方案1】:

在 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运行。

【讨论】:

    【解决方案2】:

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

    echo <password> | sudo -S <command>
    

    根据thisStackOverflow 的帖子,您可以像这样在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>"]);
    

    我希望它能帮助你和像我这样的人。

    【讨论】:

    • 应该类似于 spawn("sh", ["-c", "echo "password" | sudo -S pm2 restart 0"]);
    【解决方案3】:

    如果存在任何安全问题,黑客可以做任何事情。 您可以授予运行 Web 服务器的用户执行您的任务打算执行的任务的权限。

    一般情况下,尽可能避免 root(戴上锡箔帽)。

    【讨论】:

    • 如果您能提供一个关于攻击者如何在我的服务器上执行命令的具体示例,将不胜感激。是通过像http://xx.xx.xx.xx/addr?q=xxx&lt;insert some commands here&gt; 这样的网络服务。或者可能是我想知道的其他方式
    • @daisura99 实际上我不能给你举个例子,我不喜欢黑客攻击:)。但如果他能找到执行命令的方法,他就可以做任何他喜欢做的事情。
    猜你喜欢
    • 2012-07-29
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    相关资源
    最近更新 更多