在php中运行带有sudo的程序

时间:2016-05-04 12:17:46

标签: php python c++ sudo

我试图通过PHP运行'lightled.py'(按钮RON)和'lightledoff.py'(按钮ROFF)。这两个程序都包含GPIO库并需要root访问权限。按钮“ON”和“OFF”直接打开和关闭LED。按钮ON和OFF工作正常,但RON和ROFF没有。如何运行需要root访问权限的python或c ++程序?

<!doctype html>
<html>
    <head>
        <title>LED Test</title>
        <meta charset="UTF-8"/>
    </head>
    <body>
        <h1>Light Led</h1>
        <form method=GET action="index.php">
            <h3>Radio Led</h3>
            <input name="button" type="submit" value="RON">
            <input name="button" type="submit" value="ROFF">
            <h3>On Board Led for Test</h3>
            <input name="button" type="submit" value="ON">
            <input name="button" type="submit" value="OFF">
        </form>
        <?php
        if ($_GET["button"] == "RON") {
            system("echo raspberry | sudo -S python ./lightled.py");
        };
        if ($_GET["button"] == "ROFF") {
            system("echo raspberry | sudo -S python ./lightledoff.py");
        };
        if ($_GET["button"] == "ON") {
            system("gpio -g mode 17 out");
            system("gpio -g write 17 1");
        };
        if ($_GET["button"] == "OFF") {
            system("gpio -g mode 17 out");
            system("gpio -g write 17 0");
        };
        ?>
    </body>
</html>

2 个答案:

答案 0 :(得分:0)

您要做的是从没有权限的用户运行sudo命令,即使以root用户身份运行PHP框架,生成的用户(框架用户)也不会被sudo提升为root权限。

您必须将运行PHP脚本的框架添加到sudoers文件中,并且您应该能够通过sudo命令以root身份执行文件,就像您已经尝试过的那样。要执行此操作,您需要以root身份运行命令visudo,并向用户添加如下所示的条目:

# User Privilege Specification

root   ALL=(ALL) ALL
PHPFramework ALL=(ALL) ALL

如果你不想给PHP框架提供所有root权限(我建议即使它只是在本地运行的一个小RPi),你将不得不更具体地编辑sudo文件,阅读主题google'visudo priveleges',这是我发现的第一个点击之一:https://www.garron.me/en/linux/visudo-command-sudoers-file-sudo-default-editor.html

仅通过sudo授予运行python脚本的权限的示例:

# User Privilege Specification


PHPFramework ALL=/path/to/file/lightled.py; /path/to/python_install

其中PHPFramework是部署方法的名称,对于apache,这将是'apache'(没有qoutes)。

答案 1 :(得分:0)

''我最近发布了一个项目,允许PHP获取真正的Bash shell并与之交互。在此处获取:https://github.com/merlinthemagic/MTS

下载后,您只需使用以下代码:

    $shell    = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
   //insert command 
    $strCmd = 'echo raspberry | sudo -S python ./lightled.py';
    $return  = $shell->exeCmd($strCmd);
    //handle any return and issue next command into the shell