PHP中的自定义Linux主机控制面板 - 以root身份运行命令

时间:2015-10-25 13:55:29

标签: php linux nginx root

我想根据我在管理LEMP / LAMP堆栈方面的经验,开发自定义Linux主机控制面板。这只是一个宠物项目。我相信我遇到了一些障碍。

CP由NginX以PHP和服务器编写,作为端口8000上的默认服务器。 我没有使用任何框架,只是vanilla PHP。

在以root身份登录的putty中,我可以像这样得到系统uuid:

[root@localhost ~]# dmidecode -s system-uuid
997C4DE8-213B-4ACC-8E23-01E79D6CC12F

当我在PHP中使用以下脚本尝试此操作时:

var_dump(shell_exec('dmidecode -s system-uuid 2>&1'));

我得到以下内容:

  

sh:dmidecode:找不到命令

如何执行上述命令获取PHP输出?

Nginx / PHP-FPM以用户nginx身份运行。我是否需要将nginx用户添加到root组?

我希望能够从我的控制面板执行非常具体的命令,例如:/etc/init.d/php-fpm restart(重启php-fpm网关)。

我怎样才能做到这一点?我有什么选择?控制面板如cPanel,DirectAdmin等...是如何做到的?

更新

我也试过以下方法。已安装sudo并使用sudo visudo命令并在末尾添加以下行:

nginx    ALL=(ALL)    NOPASSWD:/path/to/php_shell.sh
Defaults:nginx        !requiretty

php_shell.sh的内容为:

#!/bin/bash
dmidecode -s system-uuid

现在,我试图像这样执行它:

var_dump(shell_exec('sudo sh /path/to/php_shell.sh 2>&1'));

我得到:sudo: no tty present and no askpass program specified

1 个答案:

答案 0 :(得分:0)

由于这个解决方案,我已修复它:https://stackoverflow.com/a/30284644/2332336

这就是我必须做的事情:

安装sudo并使用sudo visudo命令并在最后添加以下行:

nginx    ALL=(ALL)    NOPASSWD:/path/to/php_shell.sh,/bin/bash
Defaults:nginx        !requiretty

,php_shell.sh的内容是:

#!/bin/bash
dmidecode -s system-uuid

现在,我试图像这样执行它:

var_dump(shell_exec('sudo /bin/bash /path/to/php_shell.sh 2>&1'));

输出我得到:

string(36) "997C4DE8-213B-4ACC-8E23-01E79D6CC12F"

既然这是有效的,我只需要知道这是否安全,因为我只执行一组特定的命令,如dmidecode -s system-uuid并且不接受用户输入。或者,我是否已在nginx上添加visudo这样的安全漏洞?