web-dev-qa-db-fra.com

Comment vérifier quel utilisateur php est en cours d'exécution?

J'ai besoin de détecter si php fonctionne en tant que personne. Comment puis-je faire cela? 

Existe-t-il d'autres noms pour "personne"? "Apache"? D'autres?

83
Wesley

Si disponible, vous pouvez sonder le compte d'utilisateur actuel avec posix_geteuid puis obtenir le nom d'utilisateur avec posix_getpwuid .

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

Cependant, si vous utilisez le mode sans échec (ce qui est souvent le cas lorsque exec est désactivé), il est peu probable que votre processus PHP soit exécuté sous un compte autre que le compte par défaut www-data ou Apache.

57
mario

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

180
AlienWebguy

Sorte de retour, mais sans exec/system:

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

Si vous créez un fichier, le propriétaire sera l'utilisateur PHP.

Cela pourrait également probablement être exécuté avec l'une des fonctions de fichier temporaire telles que tempnam() , qui crée un fichier aléatoire dans le répertoire temporaire et renvoie le nom de ce fichier. Si des problèmes liés aux autorisations, au open_basedir ou au mode sans échec empêchent l'écriture d'un fichier, le répertoire temporaire est toujours autorisé.

62
Jonathan Kuhn

Plus de détails seraient utiles, mais en supposant qu'il s'agisse d'un système linux, et en supposant que php fonctionne sous Apache, il fonctionnera de la même manière que l'utilisateur.

Un moyen facile de vérifier (encore une fois, en supposant que certains environnements sont similaires à Unix) est de créer un fichier php avec:

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

ce qui vous donnera l'utilisateur.

Pour mon instance AWS, je reçois Apache en sortie lorsque j'exécute ce script.

20
Seth

Vous pouvez essayer d'utiliser des backticks comme ceci:

echo `whoami`;
13
ricbra

j'utiliserais:

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

aucun de ceux-ci. Vous pouvez taper em dans votre ligne de commande ssh et vous verrez quel utilisateur écoute quel service.

vous pouvez aussi aller vérifier ce fichier:

more /etc/Apache2/envvars

et cherchez ces lignes:

export Apache_RUN_USER=user-name
export Apache_RUN_GROUP=group-name

pour filtrer les données du fichier envvars, vous pouvez utiliser grep:

 more  /etc/Apache2/envvars |grep Apache_RUN_
8
Lukas

exec('whoami') le fera

<?php
exec('whoami');
?>
6
genesis

ajoutez le fichier info.php au répertoire suivant - votre répertoire http/Apache par défaut - normalement/var/www/html

avec le contenu suivant 

<?php                                                                           
phpinfo();                                                                    
?>  

Puis httpd/Apache redémarrez Allez dans votre répertoire HTML par défaut http://enter.server.here/info.php

livrerait le pedigree php entier!

2
CRTLBREAK

Dans ma configuration, je souhaite vérifier si le processus en cours est autorisé à créer des dossiers, des sous-dossiers et des fichiers avant de commencer un processus, et proposer une solution si cela semble impossible. Je voulais exécuter stat(<file>) sur différentes choses pour m'assurer que les autorisations correspondent à celles du processus en cours (j'utilise php-fpm, donc cela varie en fonction du pool).
La solution basée sur le posix que Mario a donnée ci-dessus, semble parfaite, mais il semble que l'extension posix soit --disabled. Je ne pouvais donc pas faire ce qui précède et comme je veux comparer les résultats avec la réponse de stat () exécutant whoami dans un shell séparé n'est pas utile non plus (j'ai besoin de l'uid et gid pas le nom d'utilisateur). 

Cependant, j’ai trouvé un indice utile: je pouvais utiliser stat(/proc/self) et stat(/proc/self/attr) et voir les uid et gid du fichier. 

J'espère que ça aide quelqu'un d'autre

1
sibaz

Directement à partir de Shell, vous pouvez exécuter:

php -r "echo exec('whoami');"
1

Vous pouvez utiliser ces commandes:

<? system('whoami');?>

ou

<? passthru('whoami');?>

ou

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

ou

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

ou

<? print get_current_user();?>
1
Freeman

Proposition

Un peu tard, mais même si ce qui suit est une solution de contournement, cela résout le problème car cela fonctionne parfaitement:

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


La description

La mise en surbrillance du code ci-dessus n’est pas exacte. Copiez-collez-la dans votre éditeur favori et affichez-la sous forme de code PHP ou sauvegardez-la et testez-la vous-même.

Comme vous le savez probablement, get_current_user() renvoie le propriétaire du "script en cours d'exécution" - de sorte que si vous n'avez pas "chown" un script sur le serveur à l'utilisateur du serveur Web, il s'agira probablement de "personne", ou si le développeur -user existe sur le même système d'exploitation, il affichera plutôt ce nom d'utilisateur.

Pour contourner ce problème, nous créons un fichier avec le processus en cours d'exécution. Si vous ne faites que require() this dans le script en cours d’exécution, le résultat sera identique à celui du script parent mentionné ci-dessus; donc, nous devons l'exécuter en tant que demande distincte pour prendre effet .

Flux de processus

Pour rendre cela efficace, envisagez d'exécuter un modèle de conception intégrant le "mode d'exécution". Ainsi, lorsque le serveur est en "mode de développement ou en mode test", il est le seul à pouvoir exécuter cette fonction et enregistrer sa sortie quelque part dans une inclusion. , ou simplement du texte brut ou une base de données, ou autre. 

Bien sûr, vous pouvez modifier certains détails du code ci-dessus si vous souhaitez le rendre plus dynamique, mais la logique est la suivante:

  • définir une référence unique pour limiter les interférences avec d'autres utilisateurs
  • définir un chemin de fichier local pour l'écriture d'un fichier temporaire
  • définir une URL/chemin public pour exécuter ce fichier dans son propre processus
  • écrire le fichier php temporaire qui donne le nom du propriétaire du script
  • obtenir la sortie de ce script en lui faisant une demande
  • supprimer le fichier car il n'est plus nécessaire - ou le laisser si vous le souhaitez
  • renvoie le résultat de la requête en tant que valeur de retour de la fonction
0
argon
$_SERVER["USER"]

$_SERVER["USERNAME"] 
0
Step

J'utilise habituellement

<?php echo get_current_user(); ?>

Je serai heureux si cela vous a aidé

0
yiimar
$user = $_SERVER['REMOTE_USER'];

http://php.net/manual/en/reserved.variables.server.php

Utilisateur authentifié

0
Tybion
<?php phpinfo(); ?>

enregistrer sous info.php et

ouvrez info.php dans votre navigateur

ctrl + f puis tapez l'un de ces éléments:

Apache_RUN_USER
Apache_RUN_GROUP
user/group

vous pouvez voir l'utilisateur et le groupe sous lequel Apache est exécuté.

0