Ausführen von shell-script aus einem PHP-Skript
Möchte ich ausführen eines Bash-Skript auf dem system vorhanden, aus einem PHP-Skript. Ich habe zwei scripts auf dem system vorhanden. Einer von Ihnen ist ein PHP-script aufgerufen client.php
anwesend /var/www/html
und der andere ist ein Bash-Skript namens testscript
anwesend /home/testuser
.
Meine client.php Skript sieht wie
<?php
$message=shell_exec("/home/testuser/testscript 2>&1");
print_r($message);
?>
Meine Testskripts sieht aus wie
#!/bin/bash
echo "Testscript run succesful"
Wenn ich den folgenden Code im terminal
php client.php
Bekomme ich die folgende Ausgabe auf dem terminal
Testscript run successful
Aber wenn ich öffnen Sie die Seite, auf
http://serverdomain/client.php
Bekomme ich die folgende Ausgabe
sh: /home/testuser/testscript: Permission denied
Ich bekomme diese Fehlermeldung auch, nachdem ich chmod +x Testskripts.
Wie bekomme ich es auf Arbeit aus dem browser? Bitte helfen Sie.
- Wie wäre
read
Erlaubnis?Execute
Erlaubnis ist nutzlos ohneread
Berechtigung. - Apache ist nicht gehen zu müssen, um Berechtigungen zu erreichen in Ihrem home-Verzeichnis. Noch sollte Sie jemals wirklich wollen, es zu. Denken Sie daran, dass es nicht genug Rechte für das Skript. Sie haben Zugriff auf die Verzeichnisse, die als gut. z.B. wenn ich ein "frei nehmen" - Zeitung Halter im a bank vault, niemand kann nehmen Sie die Papiere, auch wenn Sie kostenlos sind.
- Ich hatte vergessen den Pfad auf die Berechtigungen. Und eine gute Analogie.
- ich habe ls -l und bekam folgende Ausgabe: -rwxr-xr-x 1 apache apache 236 Jun 17 14:05 Testskripts. Also wie mache ich es? Wo sollte ich das Skript, so dass es ausgeführt werden kann, indem das php-Skript vom browser als auch von der bash-Skript als root ausführen.
- das Skript ist nicht das problem. es ist Ihr home-Verzeichnis. kann der apache nicht erreichen, in es. geben Sie nicht apache die Berechtigung, dies zu tun. verschieben Sie das Skript irgendwo auf dem apache KANN es bekommen.
- ich will die Testskripts root-Rechte. also ich kann mich nicht bewegen es in das Verzeichnis /var/www/html richtig?
- Siehe meine Antwort. unabhängig davon, wo es langgeht. root kann alles tun, und alles, auch wenn root nicht der Eigentümer ist.
- google für
visudo NOPASSWD
- Sie müssen grand
sudo
Berechtigungen auf Ihrem webserver auf, das Skript. Oder wickeln Sie das Skript in ein suid-binary. Aber so oder so, SEHR SEHR sehr sehr SEHR vorsichtig mit diesem. Rufen Sie das Skript falsch, pass um einige Daten falsch, und Sie haben remote-Benutzer mit root-shell auf Ihrem server, und der boom geht Ihrem server. - Das ist als schlechte Idee. 🙂 Einfach tun es nicht. Echtes Sicherheitsrisiko.
- ich möchte das php das script ausführen, und führen Sie es als root aus. Wie kann ich sonst noch tun?
- Eine andere Methode ist, läuft ein daemon, mit dem richtigen Berechtigungen, die nicht von außen erreichbar der server, und hört auf sehr spezifische Whitelist lokale Anfragen nur. Immer noch sehr vorsichtig, aber viel besser, dann geben die webserver diese Privilegien.
- Statt
#!/bin/bash
sollten Sie verwenden Sie Posix -#!/usr/bin/env bash
. Sie suchen Bash in anderen Orten, wie/usr/local/bin
falls vorhanden und auf-Pfad.
InformationsquelleAutor nmadhok | 2013-06-17
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hätte ich ein Verzeichnis irgendwo genannt Skripte, die unter der WWW-Ordner, so dass es nicht erreichbar aus dem web, aber erreichbar ist PHP.
z.B.
/var/www/scripts/testscript
Stellen Sie sicher, dass der Benutzer/die Gruppe für Ihre
testscript
ist die gleiche wie die webfiles. Zum Beispiel, wenn Ihrclient.php
ist im Besitz vonapache:apache
ändern Sie das bash-Skript dem gleichen user/Gruppe mitchown
. Finden Sie heraus, was Ihreclient.php
- und web-Dateien, sind Eigentum von tunls -al
.Führen
EDIT:
Wenn Sie wirklich wollen, starten Sie eine Datei als root von einem webserver können Sie versuchen, diese binary-wrapper unten. Überprüfen Sie heraus diese Lösung für die gleiche Sache, die Sie tun möchten.
Ausführen von root-Befehlen über PHP
www-data
, aber es funktioniert, wenn führen Sie es mitroot
Ohne wirklich zu wissen, die Komplexität des Setups, ich mag das sudo-route.
Zunächst müssen Sie konfigurieren sudo zu erlauben, um Ihren webserver zu sudo führen Sie den angegebenen Befehl als root aus. Dann müssen Sie das Skript, das der webserver shell_exec ist(Testskripts) führen Sie den Befehl mit sudo.
Für Eine Debian-box mit Apache und sudo:
Konfigurieren von sudo:
Als root laufen die folgenden, zu Bearbeiten, einen neuen/dedizierte Konfigurationsdatei für sudo:
(oder was auch immer Sie wollen, nennen Sie Ihre Datei in
/etc/sudoers.d/
)Fügen Sie den folgenden in die Datei:
wo
<executable_file_path>
ist der Befehl, den Sie brauchen, um in der Lage zu führen Sie als "root" mit dem vollständigen Pfad in seinem Namen(sagen/bin/chown
für die chown ausführbaren Datei). Wenn die ausführbare Datei ausgeführt wird, mit der gleichen Argumente, jedes mal, die Sie hinzufügen können, Ihre Argumente direkt nach der ausführbaren Datei den Namen weiter zu beschränken, Ihre Verwendung.Zum Beispiel, sagen, dass wir immer wollen, kopieren Sie die gleiche Datei in das /root/Verzeichnis, würden wir Folgendes schreiben:
Ändern Sie das Skript(Testskripts):
Bearbeiten Sie Ihr Skript so, dass
sudo
angezeigt wird, bevor der Befehl benötigt root-Rechte(sagensudo /bin/chown ...
odersudo /bin/cp /root/test1 /root/test2
). Stellen Sie sicher, dass die angegebenen Argumente in der sudo-Konfigurationsdatei genau die Argumente verwendet, die mit der ausführbaren Datei in dieser Datei.Also für unser Beispiel oben, müssten wir Folgendes in das Skript:
Wenn Sie noch die Erlaubnis verweigert, die Skript-Datei, und es ist die übergeordnete Verzeichnisse die Berechtigungen können nicht zulassen, dass der webserver das script ausführen selbst.
So, Sie brauchen, um das Skript zu einem geeigneten Verzeichnis und/oder das Skript ändern und die parent directory-Berechtigungen zu ermöglichen, die Ausführung von www-Daten(Benutzer oder Gruppe), die über den Rahmen dieses Tutorials.
Beachten Sie:
Bei der Konfiguration von sudo, das Ziel zu ermöglichen, ist der Befehl in seiner engsten form. Zum Beispiel, anstatt zu gestatten, die Allgemeine Nutzung der cp Befehl, Sie erlauben nur die cp - Befehl, wenn die Argumente sind, sagen, /root/test1 /root/test2. Dies bedeutet, dass cp's Argumente(und die cp-Funktionalität kann nicht geändert werden).
Es ist ein einfaches problem. Wenn Sie laufen vom terminal aus sind, laufen Sie die php-Datei aus dem terminal als ein privilegierter Benutzer. Wenn Sie gehen, um die php von Ihrem web-browser das php-script ausgeführt wird, wie der web-server-Benutzer, die nicht über die Berechtigungen zum ausführen von Dateien in Ihrem home-Verzeichnis. In Ubuntu ist das www-data Benutzer der apache-web-server-Benutzer. Wenn Sie auf ubuntu Sie tun müsste, wäre die folgende:
chown Benutzername:www-data /home/testuser/Testskripts
chmod g+x /home/testuser/Testskripts
was das obige nicht ist, überträgt der Benutzer Eigentümer der Datei, um Sie, und gibt die webserver-Gruppe Eigentumsverhältnisse. der nächste Befehl gibt die Gruppe ausführbaren Berechtigungen für die Datei. Nun ist die nächste mal, wenn Sie gehen Sie vor und tun Sie es aus dem browser sollte es funktionieren.
Ich kämpfte mit genau diesem Problem für drei Tage. Ich hatte die Berechtigungen auf das script auf 755. Ich hatte schon ruft mein Skript wie folgt aus.
Mein Skript wie folgt auf.
War ich immer keine Ausgabe oder ein feedback. Die änderung, die ich gemacht, um das Skript zu laufen, war fügen Sie eine cd nach /tmp in das Skript:
Dieser war mehr durch Glück als Urteil, aber es funktioniert jetzt perfekt. Ich hoffe, das hilft.