如何检查PHP正在以哪个用户身份运行?

147

我需要检测php是否以nobody身份运行。我该如何做?

还有其他与"nobody"类似的名称吗?比如"apache"?还有其他的吗?


“are there any other names”问题确切意思是什么?系统管理员可以使用任何想要的名称创建用户。 - Álvaro González
任何其他默认名称,用于可能被视为服务器的任何内容; apache、nobody、www-data等。 - user429620
1
如果我没记错的话,系统用户通常有一个小的UID(低于1024?)。这可能是你想要完成的任务的更好线索。 - Álvaro González
1
http://php.net/manual/en/function.get-current-user.php - E Ciotti
12
get_current_user()返回当前脚本的所有者,而不是PHP当前运行的用户。 - Dima L.
16个回答

246

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


1
不能真正使用exec、system或任何类似的passthru函数。 - user429620
正是我所需要的。get_current_user() 明显不是我所需要的。 - dmgig
8
对一些用户可能有用:如果您从命令行界面运行此操作,您将获得运行该命令的用户,并且 不是 PHP 用户。 - Bram Vanroy
@BramVanroy 那你应该在哪里运行它?=| - Andrew
1
@BramVanroy - 我想理解你的评论,但我不明白。如果你从cli运行它,那么不是你拥有当前的php进程吗?在这种情况下,PHP用户除了你之外还会是谁呢? - But those new buttons though..
在C-Panel中,该选项默认情况下是禁用的,至少在我检查过的两个网站上是这样。 - OAH

105

如果可用,你可以使用posix_geteuid探测当前用户账户,然后再使用posix_getpwuid获取用户名。

$username = posix_getpwuid(posix_geteuid())['name'];

然而,如果您正在安全模式下运行(通常在禁用exec时),则您的PHP进程很可能仅在默认的www-dataapache帐户下运行。


10
get_current_user()手册页面上有一条评论展示了这种方法。从PHP 5.4开始,可以缩短为这样:print posix_getpwuid(posix_geteuid())['name']; - Palec

86

有点儿反常,但不需要使用 exec/system:

file_put_contents("testFile", "test");
$user = fileowner("testFile");
unlink("testFile");

如果你创建一个文件,该文件的所有者将会是PHP用户。

这也可以使用任何临时文件函数运行,例如tempnam(),它在临时目录中创建一个随机文件并返回该文件的名称。如果由于权限、open_basedir或安全模式等原因无法写入文件,则通常仍允许写入临时目录。


2
非常聪明的跨平台解决方案。Boh! - Matt Fletcher
3
很好:这里唯一不需要特权的解决方案还能找到PHP正在运行的_组_。 - tanius
2
一次值得称赞的黑客攻击,应该得到更高的评价。 - Abraham Philip
1
除非您使用我建议的tempnam函数,否则几乎可以保证用户可以写入临时目录,无论他们是谁。如果无法写入临时目录,则可以暂时授予文件夹777权限,并在启用时禁用该路径的selinux。 - Jonathan Kuhn
1
@RavinderPayal 还有其他的函数可以返回临时路径。所以$temp_file = tempnam(sys_get_temp_dir(), 'TMP');会在大多数系统的临时目录中创建一个临时文件。然后,您可以使用该文件来获取用户/组。我留给用户自己去研究一些内容。 - Jonathan Kuhn
显示剩余4条评论

20

提供更多细节会更有帮助,但是假设这是一个Linux系统,假设PHP在Apache下运行,那么它将以Apache运行的任何用户身份运行。

检查的一种简单方法(同样假设在某个类Unix环境中)是创建一个具有以下内容的PHP文件:

<?php
    print shell_exec( 'whoami' );
?>

这将为您提供用户。

对于我的AWS实例,当我运行此脚本时,输出结果是apache


17

你可以直接从命令行运行:

php -r "echo exec('whoami');"

16
你可以尝试使用反引号,像这样:
echo `whoami`;

7
这只是上面问题的重复。 - volter9
2
可能对一些用户有用:如果您从命令行界面运行此命令,您将获得运行该命令的用户,而不是PHP用户。 - Bram Vanroy

14

不能真正使用exec或system或任何类似的passthru函数。 - user429620
@Wesley:所以那是不可能的。 - genesis
3
对于某些用户可能会有用:如果您从命令行界面运行此命令,您将获得运行命令的用户,而不是PHP用户。 - Bram Vanroy

14

我会使用:

  • lsof -i
  • lsof -i | less
  • lsof -i | grep :http

您可以在ssh命令行中输入任何一个命令,就能看到哪个用户正在监听每个服务。

您也可以检查这个文件:

more /etc/apache2/envvars

并查找这些行:

export APACHE_RUN_USER=user-name
export APACHE_RUN_GROUP=group-name

你可以使用grep来过滤掉环境变量文件的数据:

more /etc/apache2/envvars | grep APACHE_RUN_

2
grep "APACHE_RUN_" /etc/apache2/envvars 运行良好,谢谢。 - Tarik

1
将文件info.php添加到以下目录中 - 您的默认http / apache目录 - 通常为/var/www/html
具有以下内容
<?php                                                                           
phpinfo();                                                                    
?>  

然后重启httpd/apache 前往您的默认HTML目录 http://enter.server.here/info.php

将提供整个PHP家谱!


4
我们需要查找输出中的哪个变量/值? - Andrew
我相信你已经找到了,但在那个页面上搜索“用户”? - CRTLBREAK

0

您可以使用以下命令:

<? system('whoami');?>

或者

<? passthru('whoami');?>

或者

<? print exec('whoami');?>

或者

<? print shell_exec('whoami');?>

请注意,get_current_user() 返回当前 PHP 脚本所有者的名称!


1
get_current_user() 不会返回当前用户。它会返回调用该函数的脚本的所有者。 - andsens
为什么要投反对票?这是一个好答案。 - obe

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