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

标签 php linux nginx root

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

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

在 putty 中,以 root 身份登录,我可以这样获取系统 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: command not found

我怎样才能执行上面的命令在 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:不存在 tty 且未指定 askpass 程序

最佳答案

由于这个解决方案,我已经修复了它: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 并且不接受用户输入。或者,我是否通过在 visudo 上添加 nginx 这样打开了某种安全漏洞?

关于php - PHP 中的自定义 Linux 托管控制面板 - 以 root 身份运行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33330478/

相关文章:

ssl - ipython 笔记本服务器 SSL 错误

php - 根据其他表的条件从表中选择数据

php - 我如何选择字段包含精确整数的 mysql 行到字符串中?

php - JSON 输出的 Array_Merge

android - 在 ADB 中找不到 Phone Wiko Kite

php - nginx重写文件位置

javascript - 从 PHP 中的 UTF-8 字符串中删除控制字符

linux - 在驱动程序中读取内核命令行参数

c - 如何关闭我没有明确打开的 C 中的内存映射文件?

django - 为什么我的 docker-compose 卷没有通过本地文件添加进行更新?