如何检查用户php运行的是什么?

时间:2011-10-14 17:56:31

标签: php apache

我需要检测php是否作为无人运行。我该怎么做呢?

“没人”还有其他名称吗? “阿帕奇”?还有其他人吗?

16 个答案:

答案 0 :(得分:173)

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

答案 1 :(得分:64)

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

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

如果您在安全模式下运行(通常是禁用exec的情况),那么除了默认的www-dataapache帐户之外,您的PHP进程不太可能正在运行。

答案 2 :(得分:62)

有点落后的方式,但没有exec / system:

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

如果您创建文件,则所有者将是PHP用户。

这也可能与任何临时文件函数一起运行,例如tempnam(),它在临时目录中创建一个随机文件并返回该文件的名称。如果由于权限,open_basedir或安全模式等因阻止编写文件而导致问题,通常仍会允许临时目录。

答案 3 :(得分:20)

更多细节会很有用,但假设它是一个linux系统,假设php在apache下运行,那么它将像用户apache运行一样运行。

一种简单的检查方法(再次,假设某些类似unix的环境)是使用以下命令创建一个php文件:

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

将为您提供用户。

对于我的AWS实例,我在运行此脚本时输出apache

答案 4 :(得分:14)

您可以尝试使用这样的反引号:

echo `whoami`;

答案 5 :(得分:8)

我会用:

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

其中任何一个。您可以在ssh命令行中键入em,然后您将看到哪些用户正在侦听哪些服务。

您也可以查看此文件:

more /etc/apache2/envvars

并寻找这些行:

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

过滤掉envvars文件数据,可以使用grep:

 more  /etc/apache2/envvars |grep APACHE_RUN_

答案 6 :(得分:6)

exec('whoami')会这样做

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

答案 7 :(得分:2)

将文件info.php添加到以下目录 - 您的默认http / apache目录 - 通常是/ var / www / html

包含以下内容

<?php                                                                           
phpinfo();                                                                    
?>  

然后httpd / apache重启 转到默认的html目录 http://enter.server.here/info.php

将提供整个php血统!

答案 8 :(得分:1)

在我的设置中,我想检查当前进程是否有权在开始进程之前创建文件夹,子文件夹和文件,如果看起来我不能提出解决方案。我想在各种事情上运行stat(<file>)以确保权限与正在运行的进程相匹配(我使用php-fpm因此根据池而有所不同)。
Mario给出的基于posix的解决方案似乎很完美,但似乎posix扩展名是--disabled所以我无法做到以上情况,因为我想将结果与运行stat()运行{{}的响应进行比较1}}在一个单独的shell中也没有帮助(我需要uid和gid而不是用户名)。

但是我找到了一个有用的提示,我可以whoamistat(/proc/self)并查看该文件的uid和gid。

希望能帮助别人

答案 9 :(得分:1)

直接从外壳程序即可运行:

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

答案 10 :(得分:0)

我通常使用

<?php echo get_current_user(); ?>

如果能帮到你,我会很高兴

答案 11 :(得分:0)

$_SERVER["USER"]

$_SERVER["USERNAME"] 

答案 12 :(得分:0)

提案

有点晚了,但即使以下是一种解决方法,它也解决了这个要求,因为它的工作正常:

<?
    function get_sys_usr()
    {
        $unique_name = uniqid();  // not-so-unique id
        $native_path = "./temp/$unique_name.php";
        $public_path = "http://example.com/temp/$unique_name.php";
        $php_content = "<? echo get_current_user(); ?>";
        $process_usr = "apache";  // fall-back

        if (is_readable("./temp") && is_writable("./temp"))
        {
            file_put_contents($native_path,$php_content);
            $process_usr = trim(file_get_contents($public_path));
            unlink($native_path);
        }

        return $process_usr;
    }


    echo get_sys_usr();  // www-data
?>


描述

上面的代码突出显示不准确,请复制&amp;粘贴到您喜欢的编辑器中并以PHP代码的形式查看,或者自己保存并测试它。

您可能知道,get_current_user()会返回&#34;当前正在运行的脚本&#34;的所有者。 - 所以,如果你没有&#34; chown&#34;服务器上的一个脚本对于web-server-user很可能是#34; nobody&#34;,或者如果开发者用户存在于同一个操作系统上,它宁可显示该用户名。

要解决此问题,我们使用当前正在运行的进程创建一个文件。如果你只是require()这个进入当前运行的脚本,它将返回与所提到的父脚本相同的内容;所以,我们需要将其作为单独的请求运行才能生效。

过程流

为了使其有效,请考虑运行包含&#34; runtime-mode&#34;的设计模式,以便当服务器处于开发模式或测试模式时#34;然后只有它可以运行这个函数并将其输出保存在包含的地方 - 或者只是纯文本或数据库,或者以其中任何一个。

当然,您可以更改上面代码的一些细节,因为您希望使其更具动态性,但逻辑如下:

  • 定义唯一引用以限制对其他用户的干扰
  • 定义用于编写临时文件的本地文件路径
  • 定义一个公共URL /路径以在其自己的进程中运行此文件
  • 编写输出脚本所有者名称的临时php文件
  • 通过向其发出请求来获取此脚本的输出
  • 删除不再需要的文件 - 或者如果您想要
  • ,请将其保留
  • 将请求的输出作为函数的返回值
  • 返回

答案 13 :(得分:0)

$user = $_SERVER['REMOTE_USER'];

http://php.net/manual/en/reserved.variables.server.php

经过身份验证的用户

答案 14 :(得分:0)

<?php phpinfo(); ?>

另存为info.php和

在浏览器中打开info.php

ctrl + f,然后输入以下任意一项:

APACHE_RUN_USER
APACHE_RUN_GROUP
user/group

您可以看到用户和组apache正在运行。

答案 15 :(得分:0)

您可以使用以下命令:

<? system('whoami');?>

<? passthru('whoami');?>

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

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

<? print get_current_user();?>