我需要检测php是否作为无人运行。我该怎么做呢?
“没人”还有其他名称吗? “阿帕奇”?还有其他人吗?
答案 0 :(得分:173)
<?php echo exec('whoami'); ?>
答案 1 :(得分:64)
如果可用,您可以使用posix_geteuid
探测当前用户帐户,然后使用posix_getpwuid
获取用户名。
$username = posix_getpwuid(posix_geteuid())['name'];
如果您在安全模式下运行(通常是禁用exec的情况),那么除了默认的www-data
或apache
帐户之外,您的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而不是用户名)。
但是我找到了一个有用的提示,我可以whoami
和stat(/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;然后只有它可以运行这个函数并将其输出保存在包含的地方 - 或者只是纯文本或数据库,或者以其中任何一个。
当然,您可以更改上面代码的一些细节,因为您希望使其更具动态性,但逻辑如下:
答案 13 :(得分:0)
答案 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();?>