从PHP获取Apache Linux用户

29

我在一个外国的 Linux 系统上,需要确定 Apache 运行的用户(以及 PHP)。

目的:

我需要获取脚本的所有者(这没有问题,因为我可以使用 SplFileInfo),并将其与 Apache 进程的所有者进行比较。

我也可以考虑其他替代方案。

敬礼, 马里奥

编辑:

附加信息:

该脚本是一个缩略图生成器,使用 XML 文件从较大的图像生成缩略图。该脚本需要创建文件夹并编写文件。由于我无法影响 php 配置,并且没有任何 shell 访问权限,因此必须非常隐秘地完成此操作。如果创建过程失败,会通过异常停止并发送电子邮件。由于大多数 PHP 函数无法在失败时抛出异常,因此我需要手动检查以确定当前环境。因此,我需要 Apache 用户来将其与某个目录或文件所有者进行比较。


作为选项,您可以简单地使用/tmp,这对每个人都是可写的。 - Anonymous
这对我们来说没有用,因为我们无法从文档根目录外部提供任何生成的图像。 - Mario Mueller
5个回答

55

您可以调用 PHP 的 exec 函数来执行 whoami 命令:

<?php echo exec('whoami'); ?>

谢谢Grant!也感谢匿名者,这里提供的两种方法都非常适合。我将使用Grant的方法,因为我无法确定posix函数是否可用。 - Mario Mueller
1
如果启用了safe_mode并且whoami在safe_mode_exec_dir之外,exec()将无法工作。 - Anonymous
绝对正确,但对于我的目标环境来说,这是最好的解决方案。(没有 safe_mode ;)) - Mario Mueller
这适用于 LinuxUnix,但我还没有在 Windows 上测试过。 - Abel Callejo
我刚在Windows(XAMPP)上测试了一下,令人惊讶的是它可以工作,在我的情况下返回 msedgewin10\ieuser ,即 机器名\用户名。然后我尝试在简单的DOS提示符上键入 whoami,结果也是相同的。很酷。 - pgr

8
请查看 posix_getuid() 和 posix_getpwuid() 函数。

5

这里有一些复杂的答案。

对我来说,以下方法是有效的:

$user = getenv('APACHE_RUN_USER');

不确定这是否只是自从提出这个问题以来apache新增的东西,但现在它肯定存在。


在我的情况下,它没有起作用。它只返回了一个空字符串。 - Abel Callejo

1

phpinfo会输出大量的系统信息。对于安装了apache2的系统,它会显示apache用户和组的ID。尝试创建一个只有一行代码调用phpinfo()函数的PHP脚本,并在浏览器中打开它。


这不是目标 ;) 我知道如何通过php info获取用户... 我需要从脚本内部获取名称作为字符串。 - Mario Mueller
解析phpinfo(INFO_MODULES)不是一个替代方案 ;) - Mario Mueller

0

一些 PHP 脚本 必须 在 Apache 用户(CLI)上运行,此时 whoami 不适用。以下是我的解决方案:

$output = exec('apachectl -S 2>/dev/null | grep User');
$apacheUser = preg_match('/name="([^"]+)"/', $output, $match) ? $match[1] : 'www-data';

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接