¿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.
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.
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?
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.
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.
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.
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.
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.
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
Respuestas:
Si está disponible, puede probar la cuenta de usuario actual con
posix_geteuid
y luego obtener el nombre de usuario conposix_getpwuid
.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 laapache
cuenta.fuente
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'); ?>
fuente
Un poco al revés, pero sin exec / system:
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 permisosopen_basedir
o el modo seguro que impiden escribir un archivo, por lo general, el directorio temporal seguirá estando permitido.fuente
$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:
que le dará el usuario.
Para mi instancia de AWS, obtengo un
apache
resultado cuando ejecuto este script.fuente
Puede intentar usar comillas invertidas como esta:
fuente
yo usaría:
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:
y busque estas líneas:
para filtrar los datos del archivo envvars, puede usar grep:
fuente
grep "APACHE_RUN_" /etc/apache2/envvars
funcionó bien, gracias.exec('whoami')
haré estofuente
Directamente desde el caparazón puedes ejecutar:
fuente
agregue el archivo info.php al siguiente directorio, su directorio http / apache predeterminado, normalmente / var / www / html
con los siguientes contenidos
Luego httpd / apache reinicie y vaya a su directorio html predeterminado http://enter.server.here/info.php
entregaría todo el pedigrí de php!
fuente
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)
ystat(/proc/self/attr)
y ver el UID y GID del archivo.Espero que ayude a alguien más
fuente
Puede utilizar estos comandos:
o
o
o
o
fuente
Yo suelo usar
Me alegraré si te ayudó
fuente
get_current_user() - Gets the name of the owner of the current PHP script
- no el usuario que ejecuta el proceso PHP.fuente
echo $_SERVER["USER"];
funciona pero da el nombre de usuario que ha iniciado sesión en SSH.Propuesta
Un poco tarde, pero aunque lo siguiente es una solución alternativa, resuelve el requisito ya que funciona bien:
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:
fuente
guardar como info.php y
abre info.php en tu navegador
ctrl + f luego escriba cualquiera de estos:
puede ver el usuario y el grupo con el que se ejecuta apache.
fuente
http://php.net/manual/en/reserved.variables.server.php
Usuario autenticado
fuente