I need to detect if php is running as nobody. How do I do this?
Are there any other names for "nobody"? "apache"? Any others?
I need to detect if php is running as nobody. How do I do this?
Are there any other names for "nobody"? "apache"? Any others?
If available you can probe the current user account with posix_geteuid
and then get the user name with posix_getpwuid
.
$username = posix_getpwuid(posix_geteuid())['name'];
If you are running in safe mode however (which is often the case when exec is disabled), then it's unlikely that your PHP process is running under anything but the default www-data
or apache
account.
get_current_user()
manpage that shows this approach. As of PHP 5.4, it can be shortened to this: print posix_getpwuid(posix_geteuid())['name'];
–
Weatherman <?php echo exec('whoami'); ?>
If available you can probe the current user account with posix_geteuid
and then get the user name with posix_getpwuid
.
$username = posix_getpwuid(posix_geteuid())['name'];
If you are running in safe mode however (which is often the case when exec is disabled), then it's unlikely that your PHP process is running under anything but the default www-data
or apache
account.
get_current_user()
manpage that shows this approach. As of PHP 5.4, it can be shortened to this: print posix_getpwuid(posix_geteuid())['name'];
–
Weatherman Kind of backward way, but without exec/system:
file_put_contents("testFile", "test");
$user = fileowner("testFile");
unlink("testFile");
If you create a file, the owner will be the PHP user.
This could also likely be run with any of the temporary file functions such as tempnam()
, which creates a random file in the temporary directory and returns the name of that file. If there are issues due to something like the permissions, open_basedir
or safe mode that prevent writing a file, typically, the temp directory will still be allowed.
php user
is having or not. And for giving write permissions you are required to know the username, Practically only feasible for those programmers who forgot the php user
after assigning it the write permissions. –
Pester $temp_file = tempnam(sys_get_temp_dir(), 'TMP');
would create a temporary file in the temp directory on most any system. You could then use that file to get the user/group. I left some of that up to the user to figure out. –
Dellora More details would be useful, but assuming it's a linux system, and assuming php is running under apache, it will run as what ever user apache runs as.
An easy way to check ( again, assuming some unix like environment ) is to create a php file with:
<?php
print shell_exec( 'whoami' );
?>
which will give you the user.
For my AWS instance, I am getting apache
as output when I run this script.
Straight from the shell you can run:
php -r "echo exec('whoami');"
You can try using backticks like this:
echo `whoami`;
I would use:
lsof -i
lsof -i | less
lsof -i | grep :http
You can type any of these in your ssh command line and you will see which user is listening to each service.
You can also check this file:
more /etc/apache2/envvars
and look for these lines:
export APACHE_RUN_USER=user-name
export APACHE_RUN_GROUP=group-name
To filter out envvars file data, you can use grep:
more /etc/apache2/envvars | grep APACHE_RUN_
grep "APACHE_RUN_" /etc/apache2/envvars
worked well, thanks. –
Bushnell exec('whoami')
will do this
<?php
echo exec('whoami');
?>
add the file info.php to the following directory - your default http/apache directory - normally /var/www/html
with the following contents
<?php
phpinfo();
?>
Then httpd/apache restart the go to your default html directory http://enter.server.here/info.php
would deliver the whole php pedigree!
USERNAME
in the Environment
section. –
Topping In my setup I want to check if the current process has permission to create folders, subfolders and files before I begin a process and suggest a solution if it looks like I can't. I wanted to run stat(<file>)
on various things to ensure the permissions match those of the running process (I'm using php-fpm so it varies depending on the pool).
The posix based solution Mario gave above, seems perfect, however it seems the posix extension is --disabled so I couldn't do the above and as I want to compare the results with the response from running stat() running whoami
in a separate shell isn't helpful either (I need the uid and gid not the username).
However I found a useful hint, I could stat(/proc/self)
and stat(/proc/self/attr)
and see the uid and gid of the file.
Hope that helps someone else
A tad late, but even though the following is a work-around, it solves the requirement as this works just fine:
<?
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
?>
The code-highlighting above is not accurate, please copy & paste in your favorite editor and view as PHP code, or save and test it yourself.
As you probably know, get_current_user()
returns the owner of the "current running script" - so if you did not "chown" a script on the server to the web-server-user it will most probably be "nobody", or if the developer-user exists on the same OS, it will rather display that username.
To work around this, we create a file with the current running process. If you just require()
this into the current running script, it will return the same as the parent-script as mentioned; so, we need to run it as a separate request to take effect.
In order to make this effective, consider running a design pattern that incorporates "runtime-mode", so when the server is in "development-mode or test-mode" then only it could run this function and save its output somewhere in an include, -or just plain text or database, or whichever.
Of course you can change some particulars of the code above as you wish to make it more dynamic, but the logic is as follows:
You can use these commands :
<? system('whoami');?>
or
<? passthru('whoami');?>
or
<? print exec('whoami');?>
or
<? print shell_exec('whoami');?>
Be aware, the get_current_user()
returns the name of the owner of the current PHP script !
I usually use
<?php echo get_current_user(); ?>
I will be glad if it helped you
get_current_user() - Gets the name of the owner of the current PHP script
- not the user running the PHP process. –
Vassaux $_SERVER["USER"]
$_SERVER["USERNAME"]
echo $_SERVER["USER"];
works but gives the current logged in user name in SSH. –
Bushnell <?php phpinfo(); ?>
save as info.php and
open info.php in your browser
ctrl+f then type any of these:
APACHE_RUN_USER
APACHE_RUN_GROUP
user/group
you can see the user and the group apache is running as.
$user = $_SERVER['REMOTE_USER'];
http://php.net/manual/en/reserved.variables.server.php
Authenticated user
© 2022 - 2024 — McMap. All rights reserved.