Necesito detectar si php se está ejecutando como nadie. ¿Cómo hago esto?
¿Hay otros nombres para "nadie"? "apache"? ¿Cualquier otro?
Necesito detectar si php se está ejecutando como nadie. ¿Cómo hago esto?
¿Hay otros nombres para "nadie"? "apache"? ¿Cualquier otro?
Respuestas:
Si está disponible, puede probar la cuenta de usuario actual con posix_geteuid
y luego obtener el nombre de usuario con posix_getpwuid
.
$username = posix_getpwuid(posix_geteuid())['name'];
Sin embargo, si está ejecutando en modo seguro (que suele ser el caso cuando exec está deshabilitado), entonces es poco probable que su proceso PHP se esté ejecutando en otra cosa que no sea la predeterminada www-data
o la apache
cuenta.
get_current_user()
manual que muestra este enfoque. A partir de PHP 5.4, se puede acortar a esto:print posix_getpwuid(posix_geteuid())['name'];
<?php echo exec('whoami'); ?>
Un poco al revés, pero sin exec / system:
file_put_contents("testFile", "test");
$user = fileowner("testFile");
unlink("testFile");
Si crea un archivo, el propietario será el usuario de PHP.
Esto probablemente también podría ejecutarse con cualquiera de las funciones de archivo temporal, como tempnam()
, que crea un archivo aleatorio en el directorio temporal y devuelve el nombre de ese archivo. Si hay problemas debido a algo como los permisos open_basedir
o el modo seguro que impiden escribir un archivo, por lo general, el directorio temporal seguirá estando permitido.
$temp_file = tempnam(sys_get_temp_dir(), 'TMP');
lo tanto , crearía un archivo temporal en el directorio temporal en la mayoría de los sistemas. Luego puede usar ese archivo para obtener el usuario / grupo. Dejé algo de eso para que el usuario lo averiguara.
Sería útil contar con más detalles, pero asumiendo que es un sistema linux, y asumiendo que php se ejecuta bajo apache, se ejecutará como el usuario que usa apache.
Una forma fácil de verificar (nuevamente, asumiendo un entorno similar a Unix) es crear un archivo php con:
<?php
print shell_exec( 'whoami' );
?>
que le dará el usuario.
Para mi instancia de AWS, obtengo un apache
resultado cuando ejecuto este script.
Puede intentar usar comillas invertidas como esta:
echo `whoami`;
yo usaría:
lsof -i
lsof -i | less
lsof -i | grep :http
cualquiera de estos. Puede escribir em en su línea de comando ssh y verá qué usuario está escuchando qué servicio.
también puede ir y comprobar este archivo:
more /etc/apache2/envvars
y busque estas líneas:
export APACHE_RUN_USER=user-name
export APACHE_RUN_GROUP=group-name
para filtrar los datos del archivo envvars, puede usar grep:
more /etc/apache2/envvars |grep APACHE_RUN_
grep "APACHE_RUN_" /etc/apache2/envvars
funcionó bien, gracias.
exec('whoami')
haré esto
<?php
echo exec('whoami');
?>
Directamente desde el caparazón puedes ejecutar:
php -r "echo exec('whoami');"
agregue el archivo info.php al siguiente directorio, su directorio http / apache predeterminado, normalmente / var / www / html
con los siguientes contenidos
<?php
phpinfo();
?>
Luego httpd / apache reinicie y vaya a su directorio html predeterminado http://enter.server.here/info.php
entregaría todo el pedigrí de php!
En mi configuración, quiero verificar si el proceso actual tiene permiso para crear carpetas, subcarpetas y archivos antes de comenzar un proceso y sugerir una solución si parece que no puedo. Quería ejecutar stat(<file>)
varias cosas para garantizar que los permisos coincidan con los del proceso en ejecución (estoy usando php-fpm, por lo que varía según el grupo).
La solución basada en posix que Mario dio arriba parece perfecta, sin embargo, parece que la extensión de posix está desactivada, así que no pude hacer lo anterior y quiero comparar los resultados con la respuesta de ejecutar stat () whoami
en un shell separado tampoco es útil (necesito el uid y el gid no el nombre de usuario).
Sin embargo, he encontrado una pista útil, que pude stat(/proc/self)
y stat(/proc/self/attr)
y ver el UID y GID del archivo.
Espero que ayude a alguien más
Puede utilizar estos comandos:
<? system('whoami');?>
o
<? passthru('whoami');?>
o
<? print exec('whoami');?>
o
<? print shell_exec('whoami');?>
o
<? print get_current_user();?>
Yo suelo usar
<?php echo get_current_user(); ?>
Me alegraré si te ayudó
get_current_user() - Gets the name of the owner of the current PHP script
- no el usuario que ejecuta el proceso PHP.
Un poco tarde, pero aunque lo siguiente es una solución alternativa, resuelve el requisito ya que funciona bien:
<?
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
?>
El código resaltado arriba no es exacto, por favor copie y pegue en su editor favorito y véalo como código PHP, o guárdelo y pruébelo usted mismo.
Como probablemente sabes, get_current_user()
devuelve el propietario del "script en ejecución actual", por lo que si no "chown" un script en el servidor para el usuario del servidor web, lo más probable es que sea "nadie", o si el desarrollador- el usuario existe en el mismo sistema operativo, más bien mostrará ese nombre de usuario.
Para solucionar este problema, creamos un archivo con el proceso en ejecución actual. Si simplemente require()
introduce esto en el script en ejecución actual, devolverá lo mismo que el script principal como se mencionó; por lo tanto, debemos ejecutarlo como una solicitud separada para que surta efecto.
Para que esto sea efectivo, considere ejecutar un patrón de diseño que incorpore "modo de ejecución", de modo que cuando el servidor esté en "modo de desarrollo o modo de prueba", solo él podría ejecutar esta función y guardar su salida en algún lugar de una inclusión. , o simplemente texto sin formato o base de datos, o lo que sea.
Por supuesto, puede cambiar algunos detalles del código anterior si lo desea para hacerlo más dinámico, pero la lógica es la siguiente:
<?php phpinfo(); ?>
guardar como info.php y
abre info.php en tu navegador
ctrl + f luego escriba cualquiera de estos:
APACHE_RUN_USER
APACHE_RUN_GROUP
user/group
puede ver el usuario y el grupo con el que se ejecuta apache.
$user = $_SERVER['REMOTE_USER'];
http://php.net/manual/en/reserved.variables.server.php
Usuario autenticado