Answers:
如果可用,您可以使用来探测当前用户帐户,posix_geteuid
然后使用来获取用户名 posix_getpwuid
。
$username = posix_getpwuid(posix_geteuid())['name'];
但是,如果您以安全模式运行(通常在禁用exec时会发生这种情况),那么您的PHP进程不太可能在默认值www-data
或apache
帐户下运行。
get_current_user()
联机帮助页上有一条评论显示了这种方法。从PHP 5.4开始,它可以简化为:print posix_getpwuid(posix_geteuid())['name'];
<?php echo exec('whoami'); ?>
有点落后,但没有exec / system:
file_put_contents("testFile", "test");
$user = fileowner("testFile");
unlink("testFile");
如果创建文件,则所有者将是PHP用户。
这也可能与任何临时文件功能(例如)一起运行,该功能tempnam()
会在临时目录中创建一个随机文件并返回该文件的名称。如果由于诸如权限open_basedir
或安全模式之类的问题而导致无法写入文件的问题,通常,仍将允许temp目录。
$temp_file = tempnam(sys_get_temp_dir(), 'TMP');
将在大多数系统上的temp目录中创建一个临时文件。然后,您可以使用该文件来获取用户/组。我把其中的一些留给用户去弄清楚。
您可以尝试使用反引号,如下所示:
echo `whoami`;
我会用:
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_
grep "APACHE_RUN_" /etc/apache2/envvars
很好,谢谢。
exec('whoami')
将做到这一点
<?php
echo exec('whoami');
?>
直接从外壳运行:
php -r "echo exec('whoami');"
将文件info.php添加到以下目录-您的默认http / apache目录-通常为/ var / www / html
具有以下内容
<?php
phpinfo();
?>
然后httpd / apache重新启动转到默认的html目录 http://enter.server.here/info.php
将提供整个php谱系!
在我的设置中,我想检查当前进程是否有权在开始进程之前创建文件夹,子文件夹和文件,并提出解决方案(如果看起来无法解决)。我想stat(<file>)
在各种事物上运行以确保权限与正在运行的进程的权限匹配(我使用的是php-fpm,因此它取决于池)。
Mario上面给出的基于posix的解决方案似乎是完美的,但是posix扩展名似乎已被禁用,因此我无法执行上述操作,并且我想将结果与运行whoami
在单独shell中的stat()的响应进行比较也没有帮助(我需要uid和gid而不是用户名)。
不过,我发现了一个有用的提示,我可以stat(/proc/self)
和stat(/proc/self/attr)
看到的UID和GID的文件。
希望对别人有帮助
您可以使用以下命令:
<? system('whoami');?>
要么
<? passthru('whoami');?>
要么
<? print exec('whoami');?>
要么
<? print shell_exec('whoami');?>
要么
<? print get_current_user();?>
我通常使用
<?php echo get_current_user(); ?>
如果能帮到您,我会很高兴
get_current_user() - Gets the name of the owner of the current PHP script
- 不是运行PHP进程的用户。
有点迟了,但是即使以下方法可以解决,它也可以解决要求,因为它可以正常工作:
<?
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
?>
上面的代码突出显示不正确,请复制并粘贴到您喜欢的编辑器中,然后以PHP代码查看,或者您自己保存并对其进行测试。
如您所知, get_current_user()
返回“当前正在运行的脚本”的所有者-因此,如果您没有将“服务器上的脚本”“扔给” Web服务器用户,则它很可能是“没人”,或者如果开发者-用户位于同一操作系统上,它将显示该用户名。
要解决此问题,我们使用当前运行的进程创建一个文件。如果只是将require()
其放入当前正在运行的脚本中,它将返回与上述父脚本相同的内容;因此,我们需要将其作为单独的请求运行才能生效。
为了使此功能有效,请考虑运行包含“运行时模式”的设计模式,因此,当服务器处于“开发模式或测试模式”时,则只有服务器才能运行此功能并将其输出保存在包含项中,-或纯文本或数据库,或任何一个。
当然,您可以更改上面代码的某些细节,以使其更具动态性,但是逻辑如下: