php - 使用 apache 通过 php 执行 shell 脚本时,当前用户和 env 用户不匹配

标签 php linux apache shell

我在 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/

相关文章:

PHP ODBC 存储过程无效参数号

javascript - 将图像与链接集成

linux - 你如何构建 gstreamer 的 gst-launch 管道?

javascript - 如何在 apache 上实现 Angular 推送状态

JAVA Apache HttpClient SSL 超时

php - 如何在同一个 feed 中输出多个数组

php - 如何访问 htdocs 文件夹之外的 XAMPP mysql 数据库

asp.net-mvc - 当前的 RTMed ASP.NET MVC 5 项目可以在 .NET Core 上运行以在 Linux 上运行吗?

python - 什么决定了 Apache/Django 中的应用日志文件位置?