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

PHP 中的自定义 Linux 托管控制面板 - 以 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: 未找到命令

我怎样才能执行上面的命令并在 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

dmidecode通常在目录中/usr/sbin,并且并不总是在 PATH 中,因此从 php 使用完整路径,通过 找到type -p dmidecode,例如/usr/sbin/dmidecode

至于你的 sudo,你没有这样做,sudo sh ...所以sudo /path/to/php_shell.sh你的 NOPASSWD 条目不匹配。但是,最好在 sudo 文件中显式列出命令及其参数,而不是允许通用脚本以 root 身份运行。所以使用例如

Defaults:nginx        !requiretty
nginx ALL NOPASSWD:/usr/sbin/dmidecode -s system-uuid

如果您需要以 root 身份运行多个命令,请将它们放在同一行,并用逗号分隔。

相关内容