【问题标题】:Running program with sudo in php在 php 中使用 sudo 运行程序
【发布时间】:2016-05-04 12:17:46
【问题描述】:

我正在尝试通过 PHP 运行“lightled.py”(按钮 RON)和“lightledoff.py”(按钮 ROFF)。这两个程序都包含 GPIO 库并且需要 root 访问权限。按钮“开”和“关”直接打开和关闭 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>

【问题讨论】:

    标签: php python c++ sudo


    【解决方案1】:

    您尝试做的是从没有特权的用户运行 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)。

    【讨论】:

      【解决方案2】:

      ''我最近发布了一个项目,它允许 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
      

      【讨论】:

        猜你喜欢
        • 2020-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-07
        • 2020-09-27
        • 1970-01-01
        • 2016-08-04
        • 2014-11-24
        相关资源
        最近更新 更多