PHP-Skript mit shell_exec aus HTML aufrufen

  • Hallo,

    ich bin auf der Suche nach einer Möglichkeit, ein PHP-Skript beim Klicken auf einen Button in meiner Webseite im Hintergrund auszuführen.
    Codeausschnitt der Webseite:

    Code
    <script>
    //AJAX Austausch von Daten
                function sendeKoordinaten(){
                    var xhr = new XMLHttpRequest();
                    xhr.open("POST", 'datenbank_senden.php');
                    xhr.send();
                    }
    </script>
    <button type="button" id="button" onclick="sendeKoordinaten()">Koordinaten versenden</button>

    Die PHP-Seite:
    [code=php]<?php
    shell_exec("scp -r /var/www/Messroute.sqlite pi@10.10.0.20:/home/pi/Messroute.sqlite");
    exit();
    ?>[/php]

    Die Operation shell_exec wird leider nicht ausgeführt, die Datenbank wird nicht nach 10.10.0.20 kopiert.

    Woran könnte es liegen?

  • ...Wieso wollen nur immer alle shell_exec nutzen? :s

    Woher weißt du dass das nicht ausgeführt wird, oder warum das nicht funktioniert? Sagt dir shell_exec irgendeine Meldung? Nein? Na dann nutz mal stattdessen exec() und prüfe den exitcode oder allgemein die Ausgabe.
    Siehe dazu: Forumsuche nach " sudo webscript "

  • Das es nicht funktioniert merke ich daran, dass die Datenbank nicht kopiert wird.
    Ich weiß jedoch nicht, ob das Problem im php-Script oder im html-Dokument liegt, wo die php-Seite aufgerufen wird.

    exec statt shell_exec bringt auch keine Veränderungen und ehrlich gesagt weiß ich nicht, wie ich den exit-code prüfe.

  • Bemüh doch mal bitte die Forumsuche (oben rechts) und such , wie ich bereits schrieb , nach: sudo webscript
    Da findest du im ersten Treffer Beitrag#6 mehrere Beispiele in der exec(); verwendet wird und die Ausgabe sowie der Exit-Code verarbeitet wird.

    Und um sicher zu gehen das die PHP Datei funktioniert würde ich vorschlagen diese einfach mal direkt im Browser oder sogar über die Konsole aufzurufen/auszuführen. :fies:

  • Ich habe jetzt den genannten Beitrag durchgestöbert, deoch habe ich mein Problem nicht beheben können. In meinem PHP-Code wird mithilfe folgender Zeile

    PHP
    exec('sudo /var/datenbank.sh', $output, $return_var);[/php]
    die Shellscript-Datei datenbank.sh aufgerufen. Der PHP-Code scheint vollständig zu funktionieren, denn beim Inhalt von 
    [code]#!/bin/bash
    date>>/home/pi/log.txt


    Wird wie gewünscht das aktuelle Datum mit Uhrzeit in eine Textdatei geloggt. Als return_var erhalte ich 0.

    Ändere ich das Shellscript jedoch auf meinen gewünschten Befehl

    Bash
    #!/bin/bash
    scp -r /var/www/Messroute.sqlite pi@10.10.0.20:/home/pi/Messroute.sqlite


    wird dieser nicht ausgeführt und return_var=1.
    Wo liegt mein Fehler?

  • Habe nochmal eine scriptdatei erstellt:

    Bash
    #!/bin/bash
    scp -r /var/www/Messroute.sqlite pi@10.10.0.20:/home/pi/Messroute.sqlite
    date>>/home/pi/log.txt


    Der Zeitstempel wird in log.txt geschrieben, aber der vorherige Befehl nicht ausgeführt.

  • Der nachfolgende Befehl wird nur dann ausgeführt wenn der vorherige beendet wurde (warum auch immer)

    Was passiert denn wenn du das manuell ausführst?

    Code
    sudo -u www-data scp -r /var/www/Messroute.sqlite pi@10.10.0.20:/home/pi/Messroute.sqlite
  • Dann werde ich nach dem Passwort für 10.10.0.20 gefragt und nach Eingabe desselben funktioniert der Transfer.

    Wenn ich das Skript direkt in der Kommandozeile aufrufe, funktioniert es ja auch (ich habe ssh.keys hinterlegt)

    Einmal editiert, zuletzt von Niete (9. April 2015 um 20:24)

  • Stimmt, der ssh-public-key liegt in /home/pi/.ssh/authorized_keys
    Wie verwende ich den mit var-www?

    Ich verstehe nicht, wie dann das Skript erfolgreich ausgeführt werden kann, wenn ich einfach /home/pi/scripts/datenbank.sh aufrufe? Liegt es daran, dass meine php-Datei, die das Skript aufruft, in var/www liegt?

  • var-www?

    Also zu nächst mal läuft der Webserver (apache2, nginx o.ä.) als Benutzer www-data. Das hat nichts mit 'var-www' beziehungsweise dem Pfad /var/www/ zu tun.

    Wenn du manuell das Script ausführst, ist der auszuführende Benutzer : pi
    Für den Benutzer pi hast du SSH Keys hinterlegt.

    Jeder Benutzer hat aber eigene Benutzerrechte und auch sein eigenes $HOME dir, also "Heimat Verzeichnis".

    Das HOME dir vom www-data Benutzer ist standardmäßig: /var/www/ , was verwirrenderweise auch das Standard DocumentRoot von der Webserver-Software ist (apache2 / nginx Konfiguration). Das sind also eigentlich 2 verschiedene Dinge.

    Sofern dein PI nicht übers Internet ansprechbar ist, kannst du die SSH-Key Dateien also einfach kopieren und den Besitzer anpassen:

    Code
    sudo cp -r /home/pi/.ssh/ /var/www/
    
    
    sudo chown -R www-data:www-data /var/www/

    Ist dein PI aber übers Internet zugänglich würde ich dir raten das HOME dir des www-data Benutzers zu ändern, also ausserhalb des DocumentRoot Verzeichnisses /var/www/

    Code
    sudo (mkdir /home/wwwdata ; chown www-data:www-data /home/wwwdata ; sudo usermod --home /home/www-data wwwdata)
    
    
    sudo chown -R www-data:www-data /var/www/

    (die Klammer beim ersten Befehl bildet eine Befehlsgruppe und erspart das wiederholte setzen von sudo vor jeden einzelnen Befehl)

  • Hatte zunächst weiterhin die Probleme, wahrscheinlich hatte sich im Laufe der vielen Versuche ein Fehler eingeschlichen.
    Ein kompletter Neuversuch mit dem Tipp hat dann schließlich doch den Erfolg gebracht!
    Vielen Dank für die Hilfe und die verständliche Erklärung!
    Ich wäre als nie drauf gekommen, dass es an den Berechtigungen scheitert.

    Einmal editiert, zuletzt von Niete (11. April 2015 um 00:00)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!