Devo rilevare se php è in esecuzione come nessuno. Come faccio a fare questo?
Ci sono altri nomi per "nessuno"? "Apache"? Chiunque altro?
Devo rilevare se php è in esecuzione come nessuno. Come faccio a fare questo?
Ci sono altri nomi per "nessuno"? "Apache"? Chiunque altro?
Risposte:
Se disponibile, puoi sondare l'account utente corrente con posix_geteuid
e 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-data
o apache
account.
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'];
<?php echo exec('whoami'); ?>
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_basedir
o la modalità provvisoria che impediscono la scrittura di un file, in genere, la directory temporanea sarà comunque consentita.
$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.
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 apache
come output quando eseguo questo script.
Puoi provare a usare i backtick in questo modo:
echo `whoami`;
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_
grep "APACHE_RUN_" /etc/apache2/envvars
ha funzionato bene, grazie.
exec('whoami')
lo farà
<?php
echo exec('whoami');
?>
Direttamente dal guscio puoi eseguire:
php -r "echo exec('whoami');"
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!
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
Puoi usare questi comandi:
<? system('whoami');?>
o
<? passthru('whoami');?>
o
<? print exec('whoami');?>
o
<? print shell_exec('whoami');?>
o
<? print get_current_user();?>
Di solito uso
<?php echo get_current_user(); ?>
Sarò felice se ti ha aiutato
get_current_user() - Gets the name of the owner of the current PHP script
- non l'utente che esegue il processo PHP.
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
?>
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.
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:
<?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.
$user = $_SERVER['REMOTE_USER'];
http://php.net/manual/en/reserved.variables.server.php
Utente autenticato