it-swarm.com.de

Ausführen eines Shell-Skripts aus einem PHP Skript

Ich möchte ein auf dem System vorhandenes Bash-Skript über ein PHP= Skript ausführen. Auf dem System sind zwei Skripts vorhanden. Eines davon ist ein PHP Skript genannt client.php bei /var/www/html und das andere ist ein Bash-Skript namens testscript bei /home/testuser.

Mein client.php Skript sieht so aus

<?php
  $message=Shell_exec("/home/testuser/testscript 2>&1");
  print_r($message);
?>  

Mein Testskript sieht aus wie

#!/bin/bash
echo "Testscript run succesful"

Wenn ich das Folgende am Terminal mache

php client.php

Ich bekomme folgende Ausgabe am Terminal

Testscript run successful

Aber wenn ich die Seite bei öffne

http://serverdomain/client.php

Ich erhalte die folgende Ausgabe

sh: /home/testuser/testscript: Permission denied 

Ich bekomme diesen Fehler auch nachdem ich chmod + x testscript gemacht habe.
Wie kann ich es über den Browser zum Laufen bringen? Bitte helfen Sie.

25
nmadhok

Ich hätte irgendwo ein Verzeichnis namens Skripte unter dem WWW-Ordner, damit es nicht über das Web erreichbar ist, sondern über PHP.

z.B. /var/www/scripts/testscript

Stellen Sie sicher, dass der Benutzer/die Gruppe für Ihr testscript mit Ihren Webdateien übereinstimmt. Zum Beispiel, wenn Ihr client.php gehört Apache:apache, ändern Sie das Bash-Skript mit chown auf denselben Benutzer/dieselbe Gruppe. Sie können herausfinden, was Ihr client.php und Webdateien sind Eigentum von doing ls -al.

Dann renne

<?php
      $message=Shell_exec("/var/www/scripts/testscript 2>&1");
      print_r($message);
    ?>  

EDIT:

Wenn Sie wirklich eine Datei als Root von einem Webserver ausführen möchten, können Sie diesen Binär-Wrapper unten ausprobieren. Schauen Sie sich diese Lösung genau so an, wie Sie es möchten.

Root-Befehle über PHP ausführen

14
Panama Jack

Ohne wirklich die Komplexität des Aufbaus zu kennen, mag ich die Sudo-Route. Zunächst müssen Sie Sudo so konfigurieren, dass Ihr Webserver den angegebenen Befehl als root ausführen kann. Dann benötigen Sie das Skript, mit dem der Webserver Shell_exec (testscript) den Befehl mit Sudo ausführt.

Für eine Debian-Box mit Apache und Sudo:

  1. Konfigurieren Sie Sudo:

    • Führen Sie als root Folgendes aus, um eine neue/dedizierte Konfigurationsdatei für Sudo zu bearbeiten:

      visudo -f /etc/sudoers.d/Webserver
      

      (oder wie auch immer Sie Ihre Datei in /etc/sudoers.d/ aufrufen möchten)

    • Fügen Sie der Datei Folgendes hinzu:

      www-data ALL = (root) NOPASSWD: <executable_file_path>
      

      wobei <executable_file_path> der Befehl ist, den Sie benötigen, um als root mit dem vollständigen Pfad im Namen ausgeführt zu werden (sagen Sie /bin/chown für die ausführbare Datei chown). Wenn die ausführbare Datei jedes Mal mit denselben Argumenten ausgeführt wird, können Sie ihre Argumente direkt nach dem Namen der ausführbaren Datei hinzufügen, um ihre Verwendung weiter einzuschränken.

      Angenommen, wir möchten immer dieselbe Datei in das Verzeichnis/root/kopieren, dann schreiben wir Folgendes:

      www-data ALL = (root) NOPASSWD: /bin/cp /root/test1 /root/test2
      
  2. Ändern Sie das Skript (Testskript):

    Bearbeiten Sie Ihr Skript so, dass Sudo vor dem Befehl angezeigt wird, für den Root-Berechtigungen erforderlich sind (sagen Sie Sudo /bin/chown ... Oder Sudo /bin/cp /root/test1 /root/test2). Stellen Sie sicher, dass die in der Sudo-Konfigurationsdatei angegebenen Argumente genau mit den Argumenten übereinstimmen, die für die ausführbare Datei in dieser Datei verwendet werden. In unserem obigen Beispiel würde das Skript also Folgendes enthalten:

    Sudo /bin/cp /root/test1 /root/test2
    

Wenn Ihnen die Berechtigung weiterhin verweigert wird, können der Webserver das Skript möglicherweise nicht selbst ausführen. Daher müssen Sie das Skript in ein geeigneteres Verzeichnis verschieben und/oder die Berechtigungen des Skripts und des übergeordneten Verzeichnisses ändern, um die Ausführung durch WWW-Daten (Benutzer oder Gruppe) zu ermöglichen, was über den Rahmen dieses Lernprogramms hinausgeht.

Denken Sie daran:

Bei der Konfiguration von Sudo besteht das Ziel darin, den Befehl in seiner eingeschränktesten Form zuzulassen. Anstatt beispielsweise die allgemeine Verwendung des Befehls cp zuzulassen, können Sie den Befehl cp nur zulassen, wenn die Argumente beispielsweise /root/test1/root/test2. Dies bedeutet, dass die Argumente von cp (und die Funktionalität von cp nicht geändert werden kann).

4
Craig Hesling

Ich hatte drei Tage lang mit genau diesem Problem zu kämpfen. Ich hatte Berechtigungen für das Skript auf 755 festgelegt. Ich hatte mein Skript wie folgt aufgerufen.

<?php
   $outcome = Shell_exec('/tmp/clearUp.sh');
   echo $outcome;
?>

Mein Skript war wie folgt.

#!bin/bash
find . -maxdepth 1 -name "search*.csv" -mmin +0 -exec rm {} \;

Ich erhielt keine Ausgabe oder Rückmeldung. Die Änderung, die ich vorgenommen habe, um das Skript zum Laufen zu bringen, war das Hinzufügen einer CD zu tmp innerhalb des Skripts:

#!bin/bash
cd /tmp;
find . -maxdepth 1 -name "search*.csv" -mmin +0 -exec rm {} \;

Das war eher ein Glücksfall als ein Urteil, aber jetzt funktioniert es perfekt. Ich hoffe das hilft.

Es ist ein einfaches Problem. Wenn Sie vom Terminal aus starten, starten Sie die PHP-Datei vom Terminal aus als privilegierter Benutzer. Wenn Sie von Ihrem Webbrowser aus auf PHP zugreifen, wird das PHP-Skript als Webserver-Benutzer ausgeführt, der keine Berechtigungen zum Ausführen von Dateien in Ihrem Home-Verzeichnis besitzt. In Ubuntu ist der Benutzer www-data der Benutzer des Apache-Webservers. Wenn Sie unter Ubuntu arbeiten, müssen Sie Folgendes tun: Ihren Benutzernamen angeben: www-data/home/testbenutzer/testscript chmod g + x/home/testbenutzer/testscript

das oben Genannte überträgt Ihnen das Eigentum des Benutzers an der Datei und gibt der Webservergruppe das Eigentum daran. Mit dem nächsten Befehl erhält die Gruppe die ausführbare Berechtigung für die Datei. Wenn Sie das nächste Mal im Browser vorgehen, sollte dies funktionieren.

2
priyolahiri