我想根据我在管理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
答案 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
这样的安全漏洞?