我在 Linux 服务器上运行 Apache。有一组 shell 脚本需要由 PHP 脚本执行。服务器上的 Apache/PHP 仅用于此目的。 shell 脚本必须由用户“X”执行。我已将 httpd.conf 中的用户和组属性设置为用户“X”及其组。
当我调用 PHP 脚本时,我包含了 whoami 的回显。它显示用户“X”。我还在 PHP 执行的回显 whoami 和 env 变量的 shell 脚本中包含了一个日志文件的输出。当 shell 脚本运行时,它报告用户是“X”,但环境变量输出显示用户是 ROOT。这怎么可能?这最终是一个问题,因为如果 shell 脚本无法访问用户“X”的环境变量,它就无法正常运行。
[编辑] 进一步澄清。这个问题也存在于 PHP 脚本级别,所以为了简化事情,我可以重新表述这个问题,即当我在 httpd.conf 中配置 Apache 以用户“X”身份运行时,如果我触发一个回显“whoami”的 PHP 脚本和“env”,然后我看到“whoami”是用户“X”,但“env”详细信息是针对用户“root”的。 PHP 脚本看起来像这样...
<?php
echo "<br>". exec('whoami');
exec('env', $envo);
echo "<br>". print_r($envo);
?>
最佳答案
whoami
打印有效 用户 ID。
当您启动 Apache 时,我猜您是使用 root 用户或使用一些 sudo
规则来启动的。这是让 Apache 绑定(bind)低于 1024 的端口所必需的(因此默认的 80 HTTP 或 443 HTTPS 符合条件)。
在您的 Apache 配置中,您放置了 User X
(可能还有 Group X
)。这告诉 Apache,一旦第一个进程启动(通过 root),所有其他子进程将在 X:X
用户和组下运行。
因此在您的 PHP 代码中,当您运行 whoami
时,它会返回运行 PHP 的进程的有效 ID。这是 X,因为该进程是第一个进程的子进程。
但是当您运行 env
时,它会运行子进程启动时所处的环境。这个环境继承自第一个进程,由 root 启动。因此,您会看到 root 的 env
。
你的修复没问题。
关于php - 使用 apache 通过 php 执行 shell 脚本时,当前用户和 env 用户不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52785014/