shell_exec wird nicht ausgeführt

  • Tag zusammen,


    ich stehe noch am Anfang was meine PHP Kenntnisse anbelangt und ich bin schon an einem ersten Problem angekommen.


    Ich habe div. Buttons mit denen ich shell_exec Befehle ausführe(Steckdosen schalten).
    Das funktioniert auch soweit. Ich hab If-Abfragen eingebaut, um diese auszuführen.


    Kann mir jemand sagen, warum das hier funktioniert:


    Code
    if(isset($_GET['btnfl1'])){
    shell_exec("sudo /home/pi/rcswitch-pi/send 10111 3 1");
    }


    und das nicht?


    Code
    if(isset($_GET['btnled0'])){
    shell_exec("sudo ./433Utils/RPi_utils/codesend 20");
    }



    btw. im terminal funktionieren beide(die sudo's)!


    Kann man die Basics dazu irgendwo gut verständlich nachlesen?


    Gruß

    Edited once, last by lengi ().

  • Dein Webserver darf kein Sudo verwenden, das Thema gibt es xfach hier im forum, such mal webserver + script

    • Official Post

    Das erste funktioniert weil der Pfad absolut ist, das zweit nicht, weil der Pfad relativ ist. sprich beim 2. Script schaut er nicht in den home Ordner sondern sucht in /var/www nach der Datei.

  • Kannst du mir das mal genauer erklären?


    Der obere code funktioniert ja, also kann ich sudo's ausführen. Nur beim unteren Code weigert er sich...


    edit: okay, das seh ich mir mal genauer an.


    wo wir grad beim Thema wären, gibts eine Möglichkeit an die Fehlermeldungen ranzukommen? Im Terminal bekomme ich ja eine Rückmeldung, was Sache ist. Bei PHP eben nicht.



    edit2: müsste das dann jetzt nicht die lösung bringen?


    Code
    if(isset($_GET['btnled0'])){
    shell_exec("sudo /home/pi/433Utils/RPi_utils/codesend 20");
    }


    leider habe ich damit immer noch keinen Erfolg, ich bin mit Linux leider immer noch nicht so ganz warm. :s

    Edited once, last by lengi ().

    • Official Post

    ich dachte das hätte ich grade :denker:
    Relative Pfade gehen immer von dem Verzeichnis aus wo sie ausgführt werden. Da du ein PHP Seite hast und die irgendwo in /var/www liegt schaut er hier nach 433Utils/RPi_utils/codesend. Der Punkt am anfang deines "./433Utils/RPi_utils/codesend" bedeutet nämlich schaue in dem Ordner wo ich grad bin.


    Das funzt auf der Konsole auch bloss weil du dich durch Zufall in /home/pi befindest. mache mal ein

    Code
    cd ..

    und probiere dann beide Befehle nochmal. Nr1. wird gehen, Nr.2 wird sagen "Datei nicht gefunden".

  • Sorry, das mit dem erklären war auf den Post darüber bezogen. Ich hatte deinen Beitrag noch nicht gesehen.


    Wie in meinem Edit geschrieben müsste das dann doch die Lösung geben oder nicht?


    Code
    if(isset($_GET['btnled0'])){
    shell_exec("sudo /home/pi/433Utils/RPi_utils/codesend 20");
    }


    leider habe ich damit immer noch keinen Erfolg :s

    • Official Post

    Jetzt kommt noch das ins spiel was horroreyes gesagt hat, der webserver darf standardmäßig kein sudo ausführen. Wie man das umstellt verrät dir Boardsuche zu den von horroreyes genannten Schlagwörtern.


    Sollte ein

    Code
    error_reporting(E_ALL);


    am Anfang nicht alles aktivieren was man so brauch?

  • Ich bin mit Linux leider noch nicht ganz warm, kann aber auch an der Uhrzeit liegen...


    Ich steh gerade irgendwie auf dem Schlauch. Wenn mein Webserver standartmäßig keine sudo's ausführen darf, wieso funktioniert der eine sudo(oben erster Code zum Schalten der Steckdose) und der zweite sudo(codesend) funktioniert nicht?


    Die entsprechenden rechte hatte ich zuvor nämlich schon mal gegeben über:


    Code
    sudo visudo


    und


    Code
    www-data ALL=NOPASSWD: ALL

    Edited once, last by lengi ().

  • jaaaa gut, tut mir leid. Ich dachte das wäre klar, weil ich ja geschrieben hatte, dass ein sudo funktioniert und der andere nicht...:blush:


    Lach mich jetzt bitte nicht aus, aber wo genau finde ich jetzt die Error Log?
    Hab vorhin mal bei google geschaut und habe dann einer Seite entnommen, dass man den Befehl zum Anzeigen der Errors ganz oben am php-Code einfügen muss. Das habe ich getan und wo genau finde ich jetzt die Error Log?

  • Seltsam,


    Code
    error_reporting(E_ALL);


    spuckt gar nichts aus, egal wo ich das einbinde.




    Was sagt denn ein "ls -l /home/pi/433Utils/RPi_utils/codesend"? Vllt ist es keine ausführbare Datei?


    Hier kommt folgendes bei rum:


    -rwxr-xr-x pi pi 17475 May 20 19:57 /home/pi/433Utils/RPi_utils/codesend

  • mit

    Code
    error_reporting(E_ALL ^ E_DEPRECATED);
    ini_set('display_errors', true);
    ini_set('memory_limit', '64M'); //Optional, für viele Fehler^^


    Werden Errors dann dort auf der Website angezeigt wo sie auch auftraten


  • mit

    Code
    error_reporting(E_ALL ^ E_DEPRECATED);
    ini_set('display_errors', true);
    ini_set('memory_limit', '64M'); //Optional, für viele Fehler^^


    Werden Errors dann dort auf der Website angezeigt wo sie auch auftraten


    Zeigt mir ebenfalls nichts an. Hab dafür extra nochmal ne neue Datei angelegt und es wird wieder nichts ausgegeben. Ich kann mir gerade null erklären warum der eine sudo funktioniert und der andere nicht...


    Die Error Log von lighttpd ist übrigens auch leer!

  • Mache mal etwas bewusst falsch, falsche Parameter oder so. Wenn dann auch keine Fehlermeldung kommt, ist es irgendwo in der globalen Konfig verboten...

  • So, jetzt habe ich mal wieder etwas Zeit um mich wieder dem Projekt zu widmen...



    Mache mal etwas bewusst falsch, falsche Parameter oder so. Wenn dann auch keine Fehlermeldung kommt, ist es irgendwo in der globalen Konfig verboten...


    Habe ich probiert, Teile der Seite funktionieren dann nicht mehr, aber eine Fehlermeldung bekomme ich nicht... Muss ich für die Anzeige der Fehlermeldung irgendwelche Rechte vergeben?



    Oder einfach ins Error Logfile gucken: /var/log/apache2/error.log


    Ich nutze lighttpd, falls ich vergessen habe das zu erwähnen.
    In der entsprechenden Log File von lighttpd ist nichts zu finden, was auf ein Problem hinweisen könnte...




    Gruß

    Edited once, last by lengi ().

  • Wie gesagt, probier entweder das aus Beitrag #13 oder benutze anstatt shell_exec() lieber exec() .. letzteres sollte bevorzugt werden da man dadurch mehr Handlungsspielraum hat, auch was $return_var also den exitcode es ausgeführten Befehls betrifft usw


    Ich bin mir aber derzeit ziemlich sicher das der Benutzer, unter dem der Webserver lighttpd läuft, nicht die nötigen Datei-/Zugriffsrechte hat um den Befehl auszuführen.
    Poste deshalb mal bitte die Ausgabe der folgenden Befehle:
    (bitte in CODE)

    Code
    id lighttpd
    id www-data
    ls -la /var/www/
    ls -la /home/pi/rcswitch-pi/send
    ls -la /var/www/433Utils/RPi_utils/codesend
    ls -la /home/pi/433Utils/RPi_utils/codesend
    cat /etc/sudoers


    Und am besten wärs auch wenn du den Vollständigen Code deines PHP Scripts mal posten würdest, bitte ebenfalls in CODE und wenn möglich mit Formatierung zum leichteren Lese-Verständnis ;)




    PS: Eine Alternative um herauszufinden ob der Fehler am PHP Script oder an den Rechten liegt besteht auch darin über die Konsole das php Script auszuführen (als root oder mit sudo davor): php -f /var/www/script.php