Was meinst du genau mit der Frage "Gibt es noch andere Namen?" Sysadmins können Benutzer mit einem beliebigen Namen erstellen.
Álvaro González
Alle anderen Standardnamen für alles, was als Server betrachtet werden könnte; Apache, niemand, www-Daten, etc ..
Wesley
1
Wenn ich mich richtig erinnere, haben Systembenutzer normalerweise eine kleine UID (unter 1024?). Das könnte ein besserer Hinweis für alles sein, was Sie erreichen wollen.
Wenn Sie jedoch im abgesicherten Modus ausgeführt wird (was oft der Fall ist , wenn exec deaktiviert ist), dann ist es unwahrscheinlich , dass Ihr PHP - Prozess unter etwas läuft , aber das Standard - www-dataoder apacheKonto.
Exec oder System oder solche Durchgangsfunktionen können nicht wirklich verwendet werden.
Wesley
War genau das, was ich brauchte. get_current_user () war definitiv nicht das, was ich brauchte.
Dgig
5
Könnte für einige Benutzer nützlich sein: Wenn Sie dies über die Befehlszeilenschnittstelle ausführen, erhalten Sie den Benutzer, der den Befehl ausführt, und nicht den PHP-Benutzer.
Bram Vanroy
@BramVanroy wo solltest du es dann ausführen? = |
Andrew
@BramVanroy - Ich möchte Ihren Kommentar verstehen, aber ich nicht. Wenn Sie das von der CLI aus ausführen, sind Sie nicht der Eigentümer des aktuellen PHP-Prozesses? Wer wäre der PHP-Benutzer in diesem Fall anders als Sie?
Wenn Sie eine Datei erstellen, ist der Eigentümer der PHP-Benutzer.
Dies kann wahrscheinlich auch mit einer der temporären Dateifunktionen ausgeführt werden, z. B. tempnam()die eine zufällige Datei im temporären Verzeichnis erstellt und den Namen dieser Datei zurückgibt. Wenn es Probleme aufgrund von Berechtigungen open_basediroder des abgesicherten Modus gibt, die das Schreiben einer Datei verhindern, ist das temporäre Verzeichnis normalerweise weiterhin zulässig.
Schön: Die einzige nicht privilegierte Lösung hier, um auch die Gruppe zu finden, als die PHP ausgeführt wird.
Tanius
2
Ein würdiger Hack, verdient einen höheren Platz
Abraham Philip
1
@ RavinderPayal Es sei denn, Sie verwenden die Tempnam-Funktion, wie ich vorgeschlagen habe. Es ist fast garantiert, dass der Benutzer in das temporäre Verzeichnis schreiben kann, unabhängig davon, wer er ist. Ohne in das temporäre Verzeichnis schreiben zu können, können Sie einem Ordner vorübergehend 777 Berechtigungen erteilen und, falls aktiviert, Selinux für diesen Pfad deaktivieren.
Jonathan Kuhn
1
@ RavinderPayal Es gibt zusätzliche Funktionen, um den temporären Pfad zurückzugeben. So $temp_file = tempnam(sys_get_temp_dir(), 'TMP');würde eine temporäre Datei im temporären Verzeichnis auf fast jedem System erstellen. Sie können diese Datei dann verwenden, um den Benutzer / die Gruppe abzurufen. Ich habe einiges davon dem Benutzer überlassen, um es herauszufinden.
Jonathan Kuhn
20
Weitere Details wären nützlich, aber wenn es sich um ein Linux-System handelt und wenn PHP unter Apache ausgeführt wird, wird es so ausgeführt, wie der Benutzer-Apache ausgeführt wird.
Eine einfache Möglichkeit, dies zu überprüfen (wiederum unter der Annahme einer Unix-ähnlichen Umgebung), besteht darin, eine PHP-Datei zu erstellen mit:
<?php
print shell_exec('whoami');?>
das gibt Ihnen den Benutzer.
Für meine AWS-Instanz bekomme ich apache beim Ausführen dieses Skripts eine Ausgabe angezeigt.
Könnte für einige Benutzer nützlich sein: Wenn Sie dies über die Befehlszeilenschnittstelle ausführen, erhalten Sie den Benutzer, der den Befehl ausführt, und nicht den PHP-Benutzer.
Bram Vanroy
12
ich würde ... benutzen:
lsof -i
lsof -i | less
lsof -i | grep :http
eines davon. Sie können em in Ihre ssh-Befehlszeile eingeben und sehen, welcher Benutzer welchen Dienst abhört.
Exec oder System oder solche Durchgangsfunktionen können nicht wirklich verwendet werden.
Wesley
@ Wesley: Das ist also nicht möglich.
Genesis
2
Könnte für einige Benutzer nützlich sein: Wenn Sie dies über die Befehlszeilenschnittstelle ausführen, erhalten Sie den Benutzer, der den Befehl ausführt, und nicht den PHP-Benutzer.
und welche Variable / Wert in dieser Ausgabe suchen wir?
Andrew
Ich bin sicher, dass Sie dies bereits gefunden haben, aber auf dieser Seite nach "Benutzer" suchen?
CRTLBREAK
0
In meinem Setup möchte ich überprüfen, ob der aktuelle Prozess die Berechtigung zum Erstellen von Ordnern, Unterordnern und Dateien hat, bevor ich einen Prozess beginne, und eine Lösung vorschlagen, wenn es so aussieht, als ob ich es nicht kann. Ich wollte stat(<file>)verschiedene Dinge ausführen, um sicherzustellen, dass die Berechtigungen mit denen des laufenden Prozesses übereinstimmen (ich verwende php-fpm, daher variiert dies je nach Pool).
Die oben angegebene posix-basierte Lösung, die Mario oben angegeben hat, scheint perfekt zu sein, jedoch scheint die posix-Erweiterung --disabled zu sein, sodass ich die oben genannten Schritte nicht ausführen konnte und die Ergebnisse mit der Antwort von stat () vergleichen möchte, die whoamiin einer separaten Shell ausgeführt wird ist auch nicht hilfreich (ich brauche die UID und GID nicht den Benutzernamen).
Ich fand jedoch einen nützlichen Hinweis, ich konnte stat(/proc/self)und stat(/proc/self/attr)und sah die UID und GID der Datei.
Die obige Code-Hervorhebung ist nicht korrekt. Kopieren Sie sie in Ihren bevorzugten Editor und zeigen Sie sie als PHP-Code an oder speichern und testen Sie sie selbst.
Wie du wahrscheinlich weißt, get_current_user() der Eigentümer des "aktuell ausgeführten Skripts" zurückgegeben. Wenn Sie also dem Webserver-Benutzer kein Skript auf dem Server "chown" haben, ist es höchstwahrscheinlich "niemand", oder wenn der Entwickler- Benutzer existiert auf demselben Betriebssystem, es wird eher dieser Benutzername angezeigt.
Um dies zu umgehen, erstellen wir eine Datei mit dem aktuell ausgeführten Prozess. Wenn Sie dies nur require()in das aktuell ausgeführte Skript eingeben, wird dasselbe wie das übergeordnete Skript wie erwähnt zurückgegeben. Daher müssen wir es als separate Anforderung ausführen, um wirksam zu werden.
Prozessablauf
Um dies effektiv zu gestalten, sollten Sie ein Entwurfsmuster ausführen, das den "Laufzeitmodus" enthält. Wenn sich der Server also im "Entwicklungsmodus oder Testmodus" befindet, kann nur er diese Funktion ausführen und seine Ausgabe irgendwo in einem Include speichern , -oder einfach nur Text oder Datenbank oder was auch immer.
Natürlich können Sie einige Details des obigen Codes ändern, um ihn dynamischer zu gestalten, aber die Logik lautet wie folgt:
Definieren Sie eine eindeutige Referenz, um Interferenzen mit anderen Benutzern zu begrenzen
Definieren Sie einen lokalen Dateipfad zum Schreiben einer temporären Datei
Definieren Sie eine öffentliche URL / einen öffentlichen Pfad, um diese Datei in einem eigenen Prozess auszuführen
schreibe die temporäre PHP-Datei, die den Namen des Skriptbesitzers ausgibt
Rufen Sie die Ausgabe dieses Skripts ab, indem Sie eine Anfrage an das Skript senden
Löschen Sie die Datei, da sie nicht mehr benötigt wird - oder lassen Sie sie, wenn Sie möchten
Gibt die Ausgabe der Anforderung als Rückgabewert der Funktion zurück
Antworten:
Falls verfügbar, können Sie das aktuelle Benutzerkonto mit prüfen
posix_geteuid
und dann den Benutzernamen mit abrufenposix_getpwuid
.Wenn Sie jedoch im abgesicherten Modus ausgeführt wird (was oft der Fall ist , wenn exec deaktiviert ist), dann ist es unwahrscheinlich , dass Ihr PHP - Prozess unter etwas läuft , aber das Standard -
www-data
oderapache
Konto.quelle
get_current_user()
Manpage , der diesen Ansatz zeigt. Ab PHP 5.4 kann es wie folgt gekürzt werden:print posix_getpwuid(posix_geteuid())['name'];
<?php echo exec('whoami'); ?>
quelle
Art rückwärts, aber ohne exec / system:
Wenn Sie eine Datei erstellen, ist der Eigentümer der PHP-Benutzer.
Dies kann wahrscheinlich auch mit einer der temporären Dateifunktionen ausgeführt werden, z. B.
tempnam()
die eine zufällige Datei im temporären Verzeichnis erstellt und den Namen dieser Datei zurückgibt. Wenn es Probleme aufgrund von Berechtigungenopen_basedir
oder des abgesicherten Modus gibt, die das Schreiben einer Datei verhindern, ist das temporäre Verzeichnis normalerweise weiterhin zulässig.quelle
$temp_file = tempnam(sys_get_temp_dir(), 'TMP');
würde eine temporäre Datei im temporären Verzeichnis auf fast jedem System erstellen. Sie können diese Datei dann verwenden, um den Benutzer / die Gruppe abzurufen. Ich habe einiges davon dem Benutzer überlassen, um es herauszufinden.Weitere Details wären nützlich, aber wenn es sich um ein Linux-System handelt und wenn PHP unter Apache ausgeführt wird, wird es so ausgeführt, wie der Benutzer-Apache ausgeführt wird.
Eine einfache Möglichkeit, dies zu überprüfen (wiederum unter der Annahme einer Unix-ähnlichen Umgebung), besteht darin, eine PHP-Datei zu erstellen mit:
das gibt Ihnen den Benutzer.
Für meine AWS-Instanz bekomme ich
apache
beim Ausführen dieses Skripts eine Ausgabe angezeigt.quelle
Sie können versuchen, Backticks wie folgt zu verwenden:
quelle
ich würde ... benutzen:
eines davon. Sie können em in Ihre ssh-Befehlszeile eingeben und sehen, welcher Benutzer welchen Dienst abhört.
Sie können diese Datei auch überprüfen:
und suchen Sie nach diesen Zeilen:
Um die Daten der envvars-Datei herauszufiltern, können Sie grep verwenden:
quelle
grep "APACHE_RUN_" /etc/apache2/envvars
hat gut funktioniert, danke.exec('whoami')
werde das tunquelle
Direkt aus der Shell können Sie laufen:
quelle
Fügen Sie die Datei info.php dem folgenden Verzeichnis hinzu - Ihrem Standardverzeichnis http / apache - normalerweise / var / www / html
mit folgenden Inhalten
Starten Sie anschließend httpd / apache neu und wechseln Sie in Ihr Standard-HTML-Verzeichnis http://enter.server.here/info.php
würde den ganzen PHP-Stammbaum liefern!
quelle
In meinem Setup möchte ich überprüfen, ob der aktuelle Prozess die Berechtigung zum Erstellen von Ordnern, Unterordnern und Dateien hat, bevor ich einen Prozess beginne, und eine Lösung vorschlagen, wenn es so aussieht, als ob ich es nicht kann. Ich wollte
stat(<file>)
verschiedene Dinge ausführen, um sicherzustellen, dass die Berechtigungen mit denen des laufenden Prozesses übereinstimmen (ich verwende php-fpm, daher variiert dies je nach Pool).Die oben angegebene posix-basierte Lösung, die Mario oben angegeben hat, scheint perfekt zu sein, jedoch scheint die posix-Erweiterung --disabled zu sein, sodass ich die oben genannten Schritte nicht ausführen konnte und die Ergebnisse mit der Antwort von stat () vergleichen möchte, die
whoami
in einer separaten Shell ausgeführt wird ist auch nicht hilfreich (ich brauche die UID und GID nicht den Benutzernamen).Ich fand jedoch einen nützlichen Hinweis, ich konnte
stat(/proc/self)
undstat(/proc/self/attr)
und sah die UID und GID der Datei.Hoffe das hilft jemand anderem
quelle
Sie können diese Befehle verwenden:
oder
oder
oder
oder
quelle
Ich benutze normalerweise
Ich werde mich freuen, wenn es Ihnen geholfen hat
quelle
get_current_user() - Gets the name of the owner of the current PHP script
- nicht der Benutzer, der den PHP-Prozess ausführt.quelle
echo $_SERVER["USER"];
funktioniert, gibt aber den aktuell angemeldeten Benutzernamen in SSH an.Vorschlag
Ein bisschen spät, aber obwohl das Folgende eine Problemumgehung ist, löst es die Anforderung, da dies gut funktioniert:
Beschreibung
Die obige Code-Hervorhebung ist nicht korrekt. Kopieren Sie sie in Ihren bevorzugten Editor und zeigen Sie sie als PHP-Code an oder speichern und testen Sie sie selbst.
Wie du wahrscheinlich weißt,
get_current_user()
der Eigentümer des "aktuell ausgeführten Skripts" zurückgegeben. Wenn Sie also dem Webserver-Benutzer kein Skript auf dem Server "chown" haben, ist es höchstwahrscheinlich "niemand", oder wenn der Entwickler- Benutzer existiert auf demselben Betriebssystem, es wird eher dieser Benutzername angezeigt.Um dies zu umgehen, erstellen wir eine Datei mit dem aktuell ausgeführten Prozess. Wenn Sie dies nur
require()
in das aktuell ausgeführte Skript eingeben, wird dasselbe wie das übergeordnete Skript wie erwähnt zurückgegeben. Daher müssen wir es als separate Anforderung ausführen, um wirksam zu werden.Prozessablauf
Um dies effektiv zu gestalten, sollten Sie ein Entwurfsmuster ausführen, das den "Laufzeitmodus" enthält. Wenn sich der Server also im "Entwicklungsmodus oder Testmodus" befindet, kann nur er diese Funktion ausführen und seine Ausgabe irgendwo in einem Include speichern , -oder einfach nur Text oder Datenbank oder was auch immer.
Natürlich können Sie einige Details des obigen Codes ändern, um ihn dynamischer zu gestalten, aber die Logik lautet wie folgt:
quelle
Speichern Sie als info.php und
öffne info.php in deinem Browser
Geben Sie dann Strg + F ein und geben Sie eine der folgenden Optionen ein:
Sie können sehen, dass der Benutzer und der Gruppenapache als ausgeführt werden.
quelle
http://php.net/manual/en/reserved.variables.server.php
Authentifizierter Nutzer
quelle