probleme beim Ausführen eines Baschscriptes per exec

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • probleme beim Ausführen eines Baschscriptes per exec

    Morgen.

    Ich habe mir für einige Kleinigkeiten ein paar Bashscripte geschrieben , die ich gerne aus einem PHP Script aufrufen würde .

    Ich habe php 5.0.5 als modul in einem apache2 .
    Safemodus ist off , befehle wie ls -la usw konnte ich schon ohne Probleme ausführen.

    meine Scripte haben alle benötigten berechtigungen , es sollte also nicht an den rechten liegen ich hab jetzt zum testen schon alles auf 0777 gesetzt aber kein erfolg bis dato.

    Ich habe versucht die Scripte direkt per "sh ./scriptname.sh" sowie nur dem reinen Pfad selbst aufzurufen.

    Die Pfade habe zu den Scripten hab ich überprüft , das Script wird gefunden.
    Die Bash Scripte selbst funktionieren aus der Shell heraus also , kein Fehler im Script .

    Ich habe mittlerweile die Befehle :

    shell_exec
    exec
    paththru
    und die `` Operatoren getestet .

    Ohne Erfolg.

    Welches Stückchen Wissen fehlt mir noch ?

    gruß Sono

  • #2
    PHP führt die Scripte im Kontext des Users aus, unter dem der Apache läuft. Der darf meist nichts bis wenig im System, bei dir vermutlich nur ls und vergleichbar harmloses. Welcher User steht in deiner httpd.conf und was darf der von sich aus oder via sudo?
    Außerdem könnte ein Blick in /var/log/error oder /var/log/messages helfen.

    Kommentar


    • #3
      Ich habe aktuell das gleiche Problem.
      Es hängt ganz offensichtlich mit den Rechten zusammen, aber ich weiss nicht, auf welche Weise ich zum Ziel kommen kann

      Ich habe ein Program /usr/sbin/programm mit user.owner = root.root
      Meine Skripte werden vom User www-data ausgeführt.

      Was kann ich jetzt machen, um nur dieses eine Programm auszuführen vom Webserver aus?

      Ich möchte ja jetzt eigentlich nicht den User www-data in eine Gruppe packen, welche das Programm /usr/sbin/programm ausführen darf, da dann ja jedes Skript auf dem Server das Recht dazu hätte /usr/sbin/programm auszuführen.

      Am liebsten wäre es mir von PHP aus ein Shell-Skript aufzurufen, auf welches ich den Zugriff von www-data gestatte und dieses Shell-Skript wiederum starten das Programm. Aber wie kann ich es schaffen, dass das Shell-Skript /usr/sbin/programm mit einem anderen User als www-data startet?

      Kommentar


      • #4
        Zunächst mal ist es absolut egal, ob du deinem Webserver gestattest, ein Programm direkt auszuführen oder nur ein Shellscript zu starten, dass dann ein Programm ausführt. So oder so kann jedes Script auf dem Server das Programm starten.

        Nun zur Frage: Googel mal nach sudo.

        Kommentar


        • #5
          Sudo kannte ich bereits, wusste aber nicht genau, wie ich das sinnvoll einbinden soll. Nun habe ich eine für mich schöne Lösung gefunden nach einigem Gebastel.

          Meine Lösung beruht auf http://www.php.net/manual/de/function.exec.php#56274.
          Leider war das dort präsentierte Skript so noch nicht korrekt, denn der übergebene "echo-Befehl" im client-Skript wird noch als Apache-User ausgeführt und noch nicht als root.

          Hier jetzt meine Lösung, um in einem Skript was im www-Ordner liegt einen Linux-Befehl zu übergeben, welcher dann von einem zweiten Skipt ausserhalb des www-Ordners als root ausgeführt wird:

          1. Server-Datei für Shell-Zugriff im Webserver-Verzeichnis anlegen
          mcedit /var/www/shell.php
          2. Den gewünschten Befehl in Datei eintragen
          PHP-Code:
          <?php
          $befehl 
          'whoami';
          passthru 'echo "' str_replace '"''\"'$befehl ) . '" | sudo /usr/bin/php -f /home/server.php' );
          ?>
          Hier wird per echo der Linux-Befehl an die mit sudo geöffnete Datei server.php übertragen, welche nach dem öffnen mit dem User root ausgeführt wird.
          3. Datei ausserhalb des Webserver-Verzeichnisses anlegen
          mcedit /home/server.php
          4. Nun die Zeile zur Übergabe von root-Befehlen eingeben:
          PHP-Code:
          <?php
          $befehl 
          join('',file('php://stdin'));
          echo 
          exec $befehl );
          ?>
          Der Linux-Befehl „echo“, welcher oben per passthru übergeben wurde gibt in stdin den Befehls-String aus. Diesen müssen wir hier jetzt noch einmal abfangen und per exec ausführen, da der echo-Befehl in sudo.php noch ganz normal als Apache-User ausgeführt wurde.
          5. Sudo so einrichten, dass die Datei /home/server.php root-Befehle ausführen darf.
          Dazu in die Datei /etc/sudoers folgende Zeile einfügen (Achtung, die Datei muss mit „visudo“ bearbeitet werden!)
          www-data ALL=(ALL) NOPASSWD: /usr/bin/php -f /home/server.php

          Kommentar


          • #6
            So , ich arbeite gerade wieder am dem Problem.

            Ich hab jetzt noch ein paar Faq dazu gelesen mit dem Erfolg , dass ich jetzt ungefähr so schlau bin , dass es so wie ich das machen will und auch probiert habe , eigentlich gehen sollte.

            Die Scripte machen nichts weiter als backups von verschiedenen Verzeichnissen innerhalb des webservers.

            Da diese Verzeichnisse auch dem User , als welchem der Webserver gehört , gehören sollte es das problem nicht sein.

            Der apacheuser hat als shell /bin/bash , also von daher keine Einschränkungen .

            Ich hab nun auch system() erfolglos probiert , welches ja scheins den befehl quasi über eine shell erledigen soll .

            Öhm , hat noch jemand ne Idee ?

            Nachtrag :

            Mittlerweile , habe ich es geschaft ein Script zum laufen zu bekommen und zwar per system() . Das andere geht aber immernoch nicht .

            Leider habe ich jetzt soviel rumgeschraubt , dass ich noch nicht genau sagen kann warum das jetzt aufeinmal geht . Was mich irritiert , ist dass allerdings nur eines geht und der Rest scheins nicht .

            Noch ein Nachtrag :

            Es geht . Ich habe es mit system( sh ./pfad/script.sh ) hinbekommen.
            Das Problem scheint daran zu liegen , dass wohl wie ich gelesen habe , exec eine Programm direkt ausführt , whärende System das ganze in einer Shell ausführt .

            Da ich aber Shellscripte habe , na ja der Rest nutz nur unnötig die Tastatur ab.

            Danke für eure Hielfe , Gruß Sono
            Zuletzt geändert von sono; 17.09.2005, 00:26.

            Kommentar

            Lädt...
            X