Que voulez-vous dire exactement par la question «y a-t-il d'autres noms»? Les administrateurs système peuvent créer des utilisateurs avec le nom de leur choix.
Álvaro González
Tout autre nom par défaut pour tout ce qui pourrait être considéré comme le serveur; apache, personne, www-data, etc.
Wesley
1
Si je me souviens bien, les utilisateurs du système ont normalement un petit UID (inférieur à 1024?). Cela pourrait être un meilleur indice pour tout ce que vous essayez d'accomplir.
Cependant, si vous exécutez en mode sans échec (ce qui est souvent le cas lorsque exec est désactivé), il est peu probable que votre processus PHP s'exécute sous autre chose que le compte par défaut www-dataou le apachecompte.
Je ne peux pas vraiment utiliser exec ou system ou aucune de ces fonctions passthru.
Wesley
C'était exactement ce dont j'avais besoin. get_current_user () n'était pas vraiment ce dont j'avais besoin.
dgig le
5
Cela peut être utile à certains utilisateurs: si vous l'exécutez à partir de l'interface de ligne de commande, vous obtiendrez l'utilisateur qui exécute la commande, et non l'utilisateur PHP.
Bram Vanroy
@BramVanroy alors où devriez-vous l'exécuter? = |
Andrew
@BramVanroy - Je veux comprendre votre commentaire, mais je ne le fais pas. si vous exécutez cela à partir du cli, n'est-ce pas vous qui possédez le processus php actuel? Qui serait l'utilisateur PHP dans ce cas autre que vous?
Si vous créez un fichier, le propriétaire sera l'utilisateur PHP.
Cela pourrait également ê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. S'il y a des problèmes dus à quelque chose comme les autorisations open_basedirou le mode sans échec qui empêchent l'écriture d'un fichier, généralement, le répertoire temporaire sera toujours autorisé.
Nice: la seule solution non privilégiée ici pour trouver également le groupe sous lequel PHP s'exécute.
tanius
2
un hack digne, mérite une place plus élevée
Abraham Philip
1
@RavinderPayal Sauf si vous utilisez la fonction tempnam comme je l'ai suggéré. Il est presque garanti que l'utilisateur peut écrire dans le répertoire temporaire, quel qu'il soit. Sans pouvoir écrire dans le répertoire temporaire, vous pouvez temporairement accorder des autorisations 777 à un dossier et, s'il est activé, désactiver selinux pour ce chemin.
Jonathan Kuhn
1
@RavinderPayal il existe des fonctions supplémentaires pour renvoyer le chemin temporaire. Ainsi $temp_file = tempnam(sys_get_temp_dir(), 'TMP');créerait un fichier temporaire dans le répertoire temporaire sur la plupart des systèmes. Vous pouvez ensuite utiliser ce fichier pour obtenir l'utilisateur / le groupe. J'ai laissé une partie de cela à l'utilisateur pour comprendre.
Jonathan Kuhn
20
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 comme tout utilisateur apache.
Un moyen simple de vérifier (encore une fois, en supposant un environnement de type Unix) est de créer un fichier php avec:
<?php
print shell_exec('whoami');?>
qui vous donnera l'utilisateur.
Pour mon instance AWS, j'obtiens une apachesortie lorsque j'exécute ce script.
Cela peut être utile à certains utilisateurs: si vous l'exécutez à partir de l'interface de ligne de commande, vous obtiendrez l'utilisateur qui exécute la commande, et non l'utilisateur PHP.
Bram Vanroy
12
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.
Je ne peux pas vraiment utiliser exec ou system ou aucune de ces fonctions passthru.
Wesley
@Wesley: donc ce n'est pas possible.
genesis
2
Cela peut être utile à certains utilisateurs: si vous l'exécutez à partir de l'interface de ligne de commande, vous obtiendrez l'utilisateur qui exécute la commande, et non l'utilisateur PHP.
Bram Vanroy
5
Directement depuis le shell, vous pouvez exécuter:
et quelle variable / valeur recherchons-nous dans cette sortie?
Andrew
Je suis sûr que vous l'avez déjà trouvé, mais recherchez "utilisateur" sur cette page?
CRTLBREAK
0
Dans ma configuration, je veux vérifier si le processus actuel a l'autorisation de créer des dossiers, des sous-dossiers et des fichiers avant de commencer un processus et suggérer une solution si cela semble impossible. Je voulais exécuter stat(<file>)diverses 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 posix que Mario a donnée ci-dessus semble parfaite, mais il semble que l'extension posix soit --disabled, donc je ne pouvais pas faire ce qui précède et comme je veux comparer les résultats avec la réponse de l'exécution de stat () whoamidans un shell séparé n'est pas utile non plus (j'ai besoin de l'uid et du gid pas du nom d'utilisateur).
Cependant, j'ai trouvé un indice utile, je pouvais stat(/proc/self)et stat(/proc/self/attr)et voir les uid et gid du fichier.
La mise en évidence du code ci-dessus n'est pas précise, veuillez copier et coller dans votre éditeur préféré et afficher sous forme de code PHP, ou enregistrez-le et testez-le vous-même.
Comme vous le savez probablement, get_current_user()renvoie le propriétaire du "script en cours d'exécution" - donc si vous n'avez pas "chown" un script sur le serveur à l'utilisateur du serveur Web, ce sera probablement "personne", ou si le développeur- l'utilisateur existe sur le même OS, 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 faites simplement require()cela dans le script en cours d'exécution, il renverra le même que le script parent comme mentionné; donc, nous devons l'exécuter en tant que demande distincte pour prendre effet.
Flux de processus
Afin de rendre cela efficace, envisagez d'exécuter un modèle de conception qui incorpore le "mode d'exécution", donc lorsque le serveur est en "mode de développement ou en mode test", il peut alors exécuter cette fonction et enregistrer sa sortie quelque part dans un include , -ou simplement du texte brut ou de la base de données, ou selon le cas.
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 les autres utilisateurs
définir un chemin de fichier local pour écrire un fichier temporaire
définir une URL / un chemin public pour exécuter ce fichier dans son propre processus
écrire le fichier php temporaire qui renvoie le nom du propriétaire du script
obtenir la sortie de ce script en lui faisant une requête
supprimez le fichier car il n'est plus nécessaire - ou laissez-le si vous le souhaitez
renvoie la sortie de la requête comme valeur de retour de la fonction
Réponses:
Si disponible, vous pouvez rechercher le compte d'utilisateur actuel avec
posix_geteuid
, puis obtenir le nom d'utilisateur avecposix_getpwuid
.Cependant, si vous exécutez en mode sans échec (ce qui est souvent le cas lorsque exec est désactivé), il est peu probable que votre processus PHP s'exécute sous autre chose que le compte par défaut
www-data
ou leapache
compte.la source
get_current_user()
page de manuel qui montre cette approche. À partir de PHP 5.4, il peut être raccourci à ceci:print posix_getpwuid(posix_geteuid())['name'];
<?php echo exec('whoami'); ?>
la source
Un peu en arrière, mais sans exec / system:
Si vous créez un fichier, le propriétaire sera l'utilisateur PHP.
Cela pourrait également ê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. S'il y a des problèmes dus à quelque chose comme les autorisationsopen_basedir
ou le mode sans échec qui empêchent l'écriture d'un fichier, généralement, le répertoire temporaire sera toujours autorisé.la source
$temp_file = tempnam(sys_get_temp_dir(), 'TMP');
créerait un fichier temporaire dans le répertoire temporaire sur la plupart des systèmes. Vous pouvez ensuite utiliser ce fichier pour obtenir l'utilisateur / le groupe. J'ai laissé une partie de cela à l'utilisateur pour comprendre.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 comme tout utilisateur apache.
Un moyen simple de vérifier (encore une fois, en supposant un environnement de type Unix) est de créer un fichier php avec:
qui vous donnera l'utilisateur.
Pour mon instance AWS, j'obtiens une
apache
sortie lorsque j'exécute ce script.la source
Vous pouvez essayer d'utiliser des backticks comme ceci:
la source
j'utiliserais:
aucun de ceux-ci. Vous pouvez taper em dans votre ligne de commande ssh et vous verrez quel utilisateur écoute quel service.
vous pouvez également aller vérifier ce fichier:
et recherchez ces lignes:
pour filtrer les données des fichiers envvars, vous pouvez utiliser grep:
la source
grep "APACHE_RUN_" /etc/apache2/envvars
a bien fonctionné, merci.exec('whoami')
fera çala source
Directement depuis le shell, vous pouvez exécuter:
la source
ajoutez le fichier info.php dans le répertoire suivant - votre répertoire http / apache par défaut - normalement / var / www / html
avec le contenu suivant
Puis httpd / apache redémarrez et accédez à votre répertoire html par défaut http://enter.server.here/info.php
livrerait tout le pedigree php!
la source
Dans ma configuration, je veux vérifier si le processus actuel a l'autorisation de créer des dossiers, des sous-dossiers et des fichiers avant de commencer un processus et suggérer une solution si cela semble impossible. Je voulais exécuter
stat(<file>)
diverses 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 posix que Mario a donnée ci-dessus semble parfaite, mais il semble que l'extension posix soit --disabled, donc je ne pouvais pas faire ce qui précède et comme je veux comparer les résultats avec la réponse de l'exécution de stat ()
whoami
dans un shell séparé n'est pas utile non plus (j'ai besoin de l'uid et du gid pas du nom d'utilisateur).Cependant, j'ai trouvé un indice utile, je pouvais
stat(/proc/self)
etstat(/proc/self/attr)
et voir les uid et gid du fichier.J'espère que ça aide quelqu'un d'autre
la source
Vous pouvez utiliser ces commandes:
ou
ou
ou
ou
la source
J'utilise habituellement
Je serai heureux si cela t'a aidé
la source
get_current_user() - Gets the name of the owner of the current PHP script
- pas l'utilisateur exécutant le processus PHP.la source
echo $_SERVER["USER"];
fonctionne mais donne le nom d'utilisateur actuellement connecté en SSH.Proposition
Un peu tard, mais même si ce qui suit est une solution de contournement, cela résout l'exigence car cela fonctionne très bien:
La description
La mise en évidence du code ci-dessus n'est pas précise, veuillez copier et coller dans votre éditeur préféré et afficher sous forme de code PHP, ou enregistrez-le et testez-le vous-même.
Comme vous le savez probablement,
get_current_user()
renvoie le propriétaire du "script en cours d'exécution" - donc si vous n'avez pas "chown" un script sur le serveur à l'utilisateur du serveur Web, ce sera probablement "personne", ou si le développeur- l'utilisateur existe sur le même OS, 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 faites simplement
require()
cela dans le script en cours d'exécution, il renverra le même que le script parent comme mentionné; donc, nous devons l'exécuter en tant que demande distincte pour prendre effet.Flux de processus
Afin de rendre cela efficace, envisagez d'exécuter un modèle de conception qui incorpore le "mode d'exécution", donc lorsque le serveur est en "mode de développement ou en mode test", il peut alors exécuter cette fonction et enregistrer sa sortie quelque part dans un include , -ou simplement du texte brut ou de la base de données, ou selon le cas.
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:
la source
enregistrer sous info.php et
ouvrez info.php dans votre navigateur
ctrl + f puis tapez l'un de ces éléments:
vous pouvez voir l'utilisateur et le groupe apache sous lequel s'exécute.
la source
http://php.net/manual/en/reserved.variables.server.php
Utilisateur authentifié
la source