我正在Linux服务器上运行Apache。有一些需要由PHP脚本执行的Shell脚本。仅出于此目的,才需要服务器上的Apache / PHP。 Shell脚本必须由用户“ X”执行。我已将httpd.conf中的“用户”和“组”属性设置为用户“ X”及其组。
当我调用PHP脚本时,我包含了whoami的回声。它显示用户“ X”。我还在PHP执行的shell脚本中包括了日志文件的输出,该输出回显了whoami和env变量。运行Shell脚本时,它将报告用户为“ X”,但是env变量输出显示该用户为ROOT。这怎么可能?最终这是一个问题,因为如果shell脚本无法访问用户“ X”的env变量,它将无法正常运行。
[编辑] 进一步澄清。这个问题也存在于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);
?>
答案 0 :(得分:0)
我从来没有弄清楚“ whoami”和“ env”的输出之间的差异。但是,我发现可以通过创建带有导出所需变量的shell脚本,然后在调用目标shell脚本之前通过“源”进行调用来成功设置环境变量。例如,在PHP中...
exec('source /home/X/setEnvironment.sh && /home/X/scripts/targetScript.sh');
这行得通。
答案 1 :(得分:0)
whoami
显示有效用户ID。
启动Apache时,我猜您是使用root用户或某些sudo
规则来完成的。这是让Apache绑定低于1024的端口(因此默认的80 HTTP或443 HTTPS合格)所必需的。
在您的Apache配置中,您放置了User X
(可能还有Group X
)。这告诉Apache,第一个进程(通过root)启动后,所有其他子进程将在X:X
用户和组下运行。
因此,在您的PHP代码中,当您运行whoami
时,它将返回PHP在其中运行的进程的有效ID。这是X,因为该进程是第一个进程的子进程。
但是,当您运行env
时,它将运行启动子进程的环境。该环境是从第一个进程继承的,该进程由root启动。因此,您看到根的env
。
您的修复还可以。