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_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.
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_basediro 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 apachecome 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/envvarsha 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