¿Cómo comprobar con qué usuario se está ejecutando php?

115

Necesito detectar si php se está ejecutando como nadie. ¿Cómo hago esto?

¿Hay otros nombres para "nadie"? "apache"? ¿Cualquier otro?

Wesley
fuente
¿Qué quiere decir exactamente con la pregunta "hay otros nombres"? Los administradores de sistemas pueden crear usuarios con el nombre que deseen.
Álvaro González
Cualquier otro nombre predeterminado para cualquier cosa que pueda considerarse el servidor; apache, nadie, www-data, etc.
Wesley
1
Si mal no recuerdo, los usuarios del sistema normalmente tienen un UID pequeño (¿menos de 1024?). Esa podría ser una mejor pista para lo que sea que esté tratando de lograr.
Álvaro González
9
get_current_user () devuelve el propietario del script actual, no el usuario php que se está ejecutando actualmente.
Dima L.

Respuestas:

85

Si está disponible, puede probar la cuenta de usuario actual con posix_geteuidy 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-datao la apachecuenta.

mario
fuente
10
Hay un comentario en la página de 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'];
Palec
209

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

AlienWebguy
fuente
1
Realmente no se puede usar exec o system o cualquiera de esas funciones de paso.
Wesley
Era justo lo que necesitaba. get_current_user () no era lo que necesitaba definitivamente.
dgig
5
Puede ser útil para algunos usuarios: si ejecuta esto desde la interfaz de línea de comandos, obtendrá el usuario que ejecuta el comando, y no el usuario de PHP.
Bram Vanroy
@BramVanroy, ¿dónde debería ejecutarlo? = |
Andrew
@BramVanroy - Quiero entender tu comentario, pero no lo hago. si lo ejecuta desde el cli, ¿no es usted el propietario del proceso php actual? ¿Quién sería el usuario de PHP en este caso además de usted?
billynoah
72

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_basediro el modo seguro que impiden escribir un archivo, por lo general, el directorio temporal seguirá estando permitido.

Jonathan Kuhn
fuente
2
Solución multiplataforma muy inteligente. ¡Boh!
Matt Fletcher
3
Agradable: la única solución sin privilegios aquí para encontrar también el grupo con el que se ejecuta PHP.
tanius
2
un hack digno, merece un lugar más alto
Abraham Philip
1
@RavinderPayal A menos que use la función tempnam como sugerí. Está casi garantizado que el usuario puede escribir en el directorio temporal independientemente de quiénes sean. Sin poder escribir en el directorio temporal, puede otorgar temporalmente permisos 777 a una carpeta y, si está habilitado, deshabilitar selinux para esa ruta.
Jonathan Kuhn
1
@RavinderPayal hay funciones adicionales para devolver la ruta temporal. Por $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.
Jonathan Kuhn
20

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 apacheresultado cuando ejecuto este script.

Seth
fuente
16

Puede intentar usar comillas invertidas como esta:

echo `whoami`;
ricbra
fuente
7
Es solo un duplicado de las preguntas anteriores.
volter9
2
Puede ser útil para algunos usuarios: si ejecuta esto desde la interfaz de línea de comandos, obtendrá el usuario que ejecuta el comando, y no el usuario de PHP.
Bram Vanroy
12

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_
Lukas Liesis
fuente
1
grep "APACHE_RUN_" /etc/apache2/envvarsfuncionó bien, gracias.
Tarik
11

exec('whoami') haré esto

<?php
echo exec('whoami');
?>
génesis
fuente
Realmente no se puede usar exec o system o cualquiera de esas funciones de paso.
Wesley
@Wesley: eso no es posible.
Génesis
2
Puede ser útil para algunos usuarios: si ejecuta esto desde la interfaz de línea de comandos, obtendrá el usuario que ejecuta el comando, y no el usuario de PHP.
Bram Vanroy
5

Directamente desde el caparazón puedes ejecutar:

php -r "echo exec('whoami');"
Gabriel Vilches Alves
fuente
1

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!

CRTLBREAK
fuente
3
y ¿qué variable / valor en ese resultado estamos buscando?
Andrew
Estoy seguro de que ya ha encontrado esto, pero ¿busca "usuario" en esa página?
CRTLBREAK
0

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 () whoamien 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

sibaz
fuente
0

Puede utilizar estos comandos:

<? system('whoami');?>

o

<? passthru('whoami');?>

o

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

o

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

o

<? print get_current_user();?>
Hombre libre
fuente
get_current_user () no devuelve el usuario actual. Devuelve el dueño del script se llama la función de.
andsens
-1

Yo suelo usar

<?php echo get_current_user(); ?>

Me alegraré si te ayudó

yiimar
fuente
Esto ya se ha mencionado en los comentarios bajo la pregunta y tiene muy poco que ver con el usuario bajo el que se ejecuta el script.
Palec
get_current_user() - Gets the name of the owner of the current PHP script- no el usuario que ejecuta el proceso PHP.
Francisco Zarabozo
-1
$_SERVER["USER"]

$_SERVER["USERNAME"] 
Paso
fuente
echo $_SERVER["USER"];funciona pero da el nombre de usuario que ha iniciado sesión en SSH.
Tarik
-1

Propuesta

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
?>


Descripción

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.

Flujo del proceso

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:

  • definir una referencia única para limitar la interferencia con otros usuarios
  • definir una ruta de archivo local para escribir un archivo temporal
  • definir una URL / ruta pública para ejecutar este archivo en su propio proceso
  • escriba el archivo php temporal que genera el nombre del propietario del script
  • obtener la salida de este script haciendo una solicitud
  • elimine el archivo ya que ya no es necesario, o déjelo si lo desea
  • devuelve la salida de la solicitud como valor de retorno de la función

fuente
-1
<?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.

Jerome Jr. Formentera
fuente