Heim  >  Artikel  >  Backend-Entwicklung  >  Wie führe ich externe Befehle als bestimmter Benutzer in PHP aus?

Wie führe ich externe Befehle als bestimmter Benutzer in PHP aus?

DDD
DDDOriginal
2024-10-31 11:55:01961Durchsuche

How to Execute External Commands as a Specific User in PHP?

Externe Befehle als bestimmter Benutzer in PHP ausführen

Bei der Arbeit mit serverseitigen Umgebungen kommt es häufig vor, dass Sie auf Situationen stoßen, in denen Sie externe Befehlszeilenprogramme ausführen müssen aus einem PHP-Skript. Der Standardbenutzer, unter dem PHP ausgeführt wird, verfügt jedoch möglicherweise nicht über ausreichende Berechtigungen oder Zugriff auf bestimmte Anwendungen.

Problem

Stellen Sie sich ein Szenario vor, in dem Sie Apache auf localhost ausführen und versuchen, die Rhythmbox-Wiedergabe zu steuern von einem PHP-Skript, das als www-Benutzer ausgeführt wird. Das Ausführen des Befehls rhythmbox-client --pause funktioniert einwandfrei, wenn es manuell ausgeführt wird, schlägt jedoch fehl, wenn es als www-Benutzer ausgeführt wird, da Rhythmbox die Instanz des Benutzers nicht erkennt oder nicht darauf zugreift.

Lösung

Eine wirksame Lösung Die Lösung besteht darin, den Befehl sudo zu nutzen, der es Ihnen ermöglicht, das externe Programm als bestimmter Benutzer auszuführen. Dazu muss die sudoers-Datei (visudo) geändert werden, um dem Webserver-Benutzer (z. B. wwwuser) die Berechtigung zum Ausführen eines bestimmten Befehls zu erteilen:

wwwuser ALL=/usr/bin/rhythmbox-client

Dadurch wird die Fähigkeit von Apache eingeschränkt, nur den erforderlichen Befehl auszuführen, wodurch potenzielle Sicherheitsrisiken vermieden werden .

Erweiterte Lösung

In diesem speziellen Fall erkennt Rhythmbox die Instanz des Benutzers möglicherweise immer noch nicht, da PHP als www-Benutzer ausgeführt wird. Um dieses Problem zu beheben, erstellen Sie ein Bash-Skript, das rhythmbox-client aufruft und die DBUS_SESSION_BUS_ADDRESS aus der Umgebung des ausführenden Benutzers abruft:

<code class="bash">#! /bin/bash
DBUS_ADDRESS=`grep -z DBUS_SESSION_BUS_ADDRESS /proc/*/environ 2>> /dev/null| sed 's/DBUS/\nDBUS/g' | tail -n 1`
if [ "x$DBUS_ADDRESS" != "x" ]; then
        export $DBUS_ADDRESS
        /usr/bin/rhythmbox-client --pause
fi</code>

Dieses Bash-Skript kann dann von PHP als wwwuser ausgeführt werden, sodass Sie die Rhythmbox-Wiedergabe steuern können als Ihr Benutzer aus Ihrer PHP-Anwendung.

Das obige ist der detaillierte Inhalt vonWie führe ich externe Befehle als bestimmter Benutzer in PHP aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn