我想根据我管理 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 身份运行多个命令,请将它们放在同一行,并用逗号分隔。