Come verificare con quale utente è in esecuzione php?


115

Devo rilevare se php è in esecuzione come nessuno. Come faccio a fare questo?

Ci sono altri nomi per "nessuno"? "Apache"? Chiunque altro?


Cosa intendi esattamente con la domanda "ci sono altri nomi"? Gli amministratori di sistema possono creare utenti con qualsiasi nome desiderino.
Álvaro González

Qualsiasi altro nome predefinito per tutto ciò che potrebbe essere considerato il server; apache, nessuno, www-data, ecc.
Wesley

1
Se ricordo bene, gli utenti del sistema normalmente hanno un piccolo UID (inferiore a 1024?). Potrebbe essere un indizio migliore per qualunque cosa tu stia cercando di realizzare.
Álvaro González


9
get_current_user () restituisce il proprietario dello script corrente, non l'utente che php è attualmente in esecuzione.
Dima L.

Risposte:


85

Se disponibile, puoi sondare l'account utente corrente con posix_geteuide quindi ottenere il nome utente con posix_getpwuid.

$username = posix_getpwuid(posix_geteuid())['name'];

Se tuttavia stai eseguendo in modalità provvisoria (come spesso accade quando exec è disabilitato), è improbabile che il tuo processo PHP sia in esecuzione con qualcosa di diverso da quello predefinito www-datao apacheaccount.


10
C'è un commento sulla get_current_user()manpage che mostra questo approccio. A partire da PHP 5.4, può essere abbreviato in questo modo:print posix_getpwuid(posix_geteuid())['name'];
Palec

209

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


1
Non è possibile utilizzare realmente exec o system o alcuna di queste funzioni passanti.
Wesley

Era proprio quello di cui avevo bisogno. get_current_user () non era quello di cui avevo assolutamente bisogno.
dgig

5
Potrebbe essere utile per alcuni utenti: se lo esegui dall'interfaccia della riga di comando otterrai l'utente che esegue il comando e non l'utente PHP.
Bram Vanroy

@BramVanroy allora dove dovresti eseguirlo? = |
Andrew

@BramVanroy - Voglio capire il tuo commento, ma non lo faccio. se lo esegui dalla cli, non sei il proprietario dell'attuale processo php? Chi sarebbe l'utente PHP in questo caso diverso da te?
billynoah

72

Un po 'all'indietro, ma senza exec / system:

file_put_contents("testFile", "test");
$user = fileowner("testFile");
unlink("testFile");

Se crei un file, il proprietario sarà l'utente PHP.

Questo potrebbe anche essere probabilmente eseguito con una qualsiasi delle funzioni di file temporaneo come tempnam(), che crea un file casuale nella directory temporanea e restituisce il nome di quel file. Se ci sono problemi dovuti a qualcosa come le autorizzazioni open_basediro la modalità provvisoria che impediscono la scrittura di un file, in genere, la directory temporanea sarà comunque consentita.


2
Soluzione multipiattaforma molto intelligente. Boh!
Matt Fletcher

3
Bello: l'unica soluzione non privilegiata qui per trovare anche il gruppo in cui è in esecuzione PHP.
tanius

2
un degno hack, merita un posto più alto
Abraham Philip

1
@RavinderPayal A meno che tu non usi la funzione tempnam come ti ho suggerito. È quasi garantito che l'utente possa scrivere nella directory temporanea indipendentemente da chi sia. Senza essere in grado di scrivere nella directory temporanea, potresti dare temporaneamente a una cartella i permessi 777 e, se abilitato, disabilitare selinux per quel percorso.
Jonathan Kuhn

1
@RavinderPayal ci sono funzioni aggiuntive per restituire il percorso temporaneo. Quindi $temp_file = tempnam(sys_get_temp_dir(), 'TMP');creerebbe un file temporaneo nella directory temporanea sulla maggior parte dei sistemi. È quindi possibile utilizzare quel file per ottenere l'utente / gruppo. Ho lasciato un po 'di tempo all'utente da capire.
Jonathan Kuhn

20

Maggiori dettagli sarebbero utili, ma supponendo che sia un sistema Linux, e supponendo che php sia in esecuzione sotto apache, funzionerà come qualunque utente apache venga eseguito.

Un modo semplice per controllare (di nuovo, assumendo un ambiente simile a unix) è creare un file php con:

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

che ti darà l'utente.

Per la mia istanza AWS, ricevo apachecome output quando eseguo questo script.


16

Puoi provare a usare i backtick in questo modo:

echo `whoami`;

7
È solo un duplicato delle domande sopra.
volter9

2
Potrebbe essere utile per alcuni utenti: se lo esegui dall'interfaccia della riga di comando otterrai l'utente che esegue il comando e non l'utente PHP.
Bram Vanroy

12

io userei:

lsof -i
lsof -i | less
lsof -i | grep :http

uno di questi. Puoi digitare em nella tua riga di comando ssh e vedrai quale utente sta ascoltando quale servizio.

puoi anche andare a controllare questo file:

more /etc/apache2/envvars

e cerca queste righe:

export APACHE_RUN_USER=user-name
export APACHE_RUN_GROUP=group-name

per filtrare i dati del file envvars, puoi usare grep:

 more  /etc/apache2/envvars |grep APACHE_RUN_

1
grep "APACHE_RUN_" /etc/apache2/envvarsha funzionato bene, grazie.
Tarik

11

exec('whoami') lo farà

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

Non è possibile utilizzare realmente exec o system o alcuna di queste funzioni passanti.
Wesley

@ Wesley: quindi non è possibile.
genesis

2
Potrebbe essere utile per alcuni utenti: se lo esegui dall'interfaccia della riga di comando otterrai l'utente che esegue il comando e non l'utente PHP.
Bram Vanroy


1

aggiungi il file info.php alla seguente directory - la tua directory http / apache predefinita - normalmente / var / www / html

con i seguenti contenuti

<?php                                                                           
phpinfo();                                                                    
?>  

Quindi httpd / apache riavvia e vai alla directory html predefinita http://enter.server.here/info.php

fornirebbe l'intero pedigree php!


3
e quale variabile / valore in quell'output stiamo cercando?
Andrew

Sono sicuro che l'hai già trovato ma cerchi "utente" in quella pagina?
CRTLBREAK

0

Nella mia configurazione voglio verificare se il processo corrente ha il permesso di creare cartelle, sottocartelle e file prima di iniziare un processo e suggerire una soluzione se sembra che non posso. Volevo eseguire stat(<file>)varie cose per assicurarmi che i permessi corrispondessero a quelli del processo in esecuzione (sto usando php-fpm quindi varia a seconda del pool).
La soluzione basata su posix che Mario ha dato sopra, sembra perfetta, tuttavia sembra che l'estensione posix sia --disabled, quindi non ho potuto fare quanto sopra e poiché voglio confrontare i risultati con la risposta dell'esecuzione di stat () in esecuzionewhoami in una shell separata non è utile neanche (ho bisogno di uid e gid non del nome utente).

Tuttavia ho trovato un suggerimento utile, potrei stat(/proc/self)estat(/proc/self/attr) per vedere l'uid e gid del file.

Spero che aiuti qualcun altro


0

Puoi usare questi comandi:

<? system('whoami');?>

o

<? passthru('whoami');?>

o

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

o

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

o

<? print get_current_user();?>

get_current_user () non restituisce l'utente corrente. Restituisce il proprietario dello script in cui è chiamata la funzione.
andsens

-1

Di solito uso

<?php echo get_current_user(); ?>

Sarò felice se ti ha aiutato


Questo è già stato menzionato nei commenti sotto la domanda e ha solo pochissimo a che fare con l'utente con cui viene eseguito lo script.
Palec

get_current_user() - Gets the name of the owner of the current PHP script- non l'utente che esegue il processo PHP.
Francisco Zarabozo

-1
$_SERVER["USER"]

$_SERVER["USERNAME"] 

echo $_SERVER["USER"];funziona ma fornisce il nome utente attualmente connesso in SSH.
Tarik

-1

Proposta

Un po 'tardi, ma anche se il seguente è un rimedio, risolve il requisito poiché funziona perfettamente:

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


Descrizione

L'evidenziazione del codice sopra non è accurata, copia e incolla nel tuo editor preferito e visualizza come codice PHP, oppure salvalo e provalo tu stesso.

Come probabilmente sai, get_current_user() restituisce il proprietario dello "script corrente in esecuzione" - quindi se non hai "chown" uno script sul server all'utente del server web, molto probabilmente sarà "nessuno", o se lo sviluppatore- l'utente esiste sullo stesso sistema operativo, visualizzerà piuttosto quel nome utente.

Per ovviare a questo, creiamo un file con il processo in esecuzione corrente. Se lo require()inserisci nello script corrente in esecuzione, restituirà lo stesso dello script genitore come menzionato; quindi, dobbiamo eseguirlo come richiesta separata per avere effetto.

Flusso di processo

Per renderlo efficace, considera di eseguire un design pattern che incorpori la "modalità runtime", così quando il server è in "modalità di sviluppo o modalità di test" allora solo lui può eseguire questa funzione e salvare il suo output da qualche parte in un include , -o solo testo normale o database, o qualsiasi altra cosa.

Ovviamente puoi modificare alcuni particolari del codice sopra come desideri per renderlo più dinamico, ma la logica è la seguente:

  • definire un riferimento univoco per limitare le interferenze con altri utenti
  • definire un percorso file locale per scrivere un file temporaneo
  • definire un URL / percorso pubblico per eseguire questo file nel proprio processo
  • scrivere il file php temporaneo che restituisce il nome del proprietario dello script
  • ottenere l'output di questo script facendogli una richiesta
  • eliminare il file poiché non è più necessario o lasciarlo se lo si desidera
  • restituisce l'output della richiesta come valore di ritorno della funzione

-1
<?php phpinfo(); ?>

salva come info.php e

apri info.php nel tuo browser

ctrl + f quindi digita uno di questi:

APACHE_RUN_USER
APACHE_RUN_GROUP
user/group

puoi vedere l'utente e il gruppo apache è in esecuzione come.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.