output shell_exec

  • Hallo zusammen,


    ich habe ein Problem mit PHP und dem Befehl "shell_exec".
    Mein Ziel ist es, wo schon viele andere vor mir, eine Funksteckdose per Webinterface zu steuern.
    Über die Kommandozeile klappt es prima, jedoch bekomme bekomme ich einfach keinen Rückgabewert (Output) zurück wenn ich es über PHP aufrufe.


    Führe ich folgenden Befehl auf Kommandozeile aus bekomme ich einen Rückgabewert:

    Code
    www-data@raspberrypi:~/home$ sudo /usr/local/sbin/send433 11111 11 1
    sending systemCode[11111] unitCode[11] command[1]


    Über PHP bekomme ich keinen Rückgabewert. Warum?
    Hier dazu der PHP Code:
    [code=php]
    <?php
    class Send433 {


    private $systemCode = "";
    private $unitCode = "";


    function __construct($systemCode, $unitCode) {
    $this->systemCode = $systemCode;
    $this->unitCode = $unitCode;
    }


    private function sendSwitch($on) {
    $command = $on == TRUE ? "1" : "0";
    $cmd = "sudo /usr/local/sbin/send433 " . $this->systemCode . " " . $this->unitCode . " " . $command;
    $output = shell_exec($cmd);
    echo $cmd;
    echo "\n";
    echo $output;
    }


    function sendSwitchOn() {
    $this->sendSwitch(TRUE);
    }


    function sendSwitchOff() {
    $this->sendSwitch(FALSE);
    }
    }


    $obj = new Send433("11111", "11");


    $obj->sendSwitchOn();


    ?>
    [/php]


    Ich weis, das Thema wurde schon tausendfach diskutiert, aber ich komme nicht weiter.


    Vielleicht weis von euch einer mehr dazu?


    Vielen Dank. :)

  • Wird denn geschaltet? Ich vermute mal nicht und das könnte daran liegen, das der User unter der der Webserver läuft keine sudo Rechte hat. Laut PHP Doku wird bei shell_exec im Fehlerfall NULL (also nix) zurückgegeben, daher ist das recht wahrscheinlich.
    [hr]
    Ok.. wer lesen kann... dann versuchs mal mit dem kompletten Pfad zu sudo... Rauszufinden via 'which sudo'
    [hr]
    du könntest auch via "sudo ..../send433..... 2>&1" versuchen die Fehlermeldung ausgegeben zu bekommen - allerdings muss du da bestimmt noch ein paar \ einfügen... denke ich.

    --
    man ist das System-Anzeigeprogramm für die Handbuchseiten von Linux.

    Edited once, last by Lunepi ().

  • Hallo,


    wenn ich mich mit dem User "www-data" auf Console einlogge, dann funktioniert dieser Befehl

    Code
    sudo /usr/local/sbin/send433 11111 11 1


    und es kommt die Ausgabe

    Code
    sending systemCode[11111] unitCode[11] command[1]


    zurück.


    Der komplette Pfad zur "send433" wurde angegeben.


    Kannst du mir das mit den Ausgaben noch genauer erklären?
    Was bedeutet

    Code
    2>&1


    ?


    Im Apache-LogFile habe ich keine Fehlermeldung gefunden/gesehen.

  • Jetzt wieder hole ich mich ;): Wer lesen kann... Ich sagte auch den Pfad zum 'sudo' nicht zum send433


    2 StANDARD ERROR
    1 STANDARD OUTPUT
    mit 2>&1 wird Error nach STDOUT weitergeleitet und du bekommst die Fehlermeldung trozdem angezeigt auch wenn php sagt "STDERR zege ich nicht an" Mehr steht dazu in der manpage der bash


    man bash

    --
    man ist das System-Anzeigeprogramm für die Handbuchseiten von Linux.

  • Hallo zusammen,


    nun habe ich mein PHP Script angepasst auf die Funktion "exec()".


    Als Output bekomme ich wieder einen Leerstring, allerdings bekomme ich den ReturnValue 139.


    Nur was sagt der ReturnValue 139 aus?
    Habe dazu nirgends etwas gefunden...

  • Zeig mal bitte deine neue PHP Datei und die genaue Ausgabe.



    Googlesuche nach: exitcode 139
    Ergebnis:
    If the error returned is >128, subtract 128 to get the signal number.
    128+signal when a signal received. 128 + 11 = 139. Program died with Signal 11. Signal 11 is SIGSEGV (i.e. Segmentation Violation / Segmentation fault). = There is a memory access bug

  • Hallo meigrafd,


    meine Ausgabe kommt nach dem Umbau auf das sudowebscript.sh so aus:

    Code
    Kommando: sudo /var/sudowebscript.sh send433 11111 11 1
     Ergebniscode: 139
     Ausgaben:


    meine PHP Datei sieht mittlerweile wie folgt aus:


    [PHP]
    <?php
    class Send433 {


    private $systemCode = "";
    private $unitCode = "";


    function __construct($systemCode, $unitCode) {
    $this->systemCode = $systemCode;
    $this->unitCode = $unitCode;
    }


    private function sendSwitch($on) {
    $command = $on == TRUE ? "1" : "0";
    $cmd = "sudo /var/sudowebscript.sh send433 " . $this->systemCode . " " . $this->unitCode . " " . $command;
    exec($cmd, $output, $return);
    echo "Kommando: " . $cmd . "<br/>\n";
    echo "Ergebniscode: " . $return . "<br/>\n";
    //echo print_r($output);
    echo "Ausgaben: <br/>\n";
    foreach ($output as $out) {
    echo $out;
    echo "<br/>\n";
    }
    }


    function sendSwitchOn() {
    $this->sendSwitch(TRUE);
    }


    function sendSwitchOff() {
    $this->sendSwitch(FALSE);
    }
    }


    $obj = new Send433("11111", "11");


    $obj->sendSwitchOn();


    ?>
    [/PHP]


    Mein webstartscript.sh so:



    Was ich mir nicht erklären kann, warum es auf der Kommando Zeile funktioniert? :(

  • Hm änder das exit $? im /var/sudowebscript.sh mal bitte ab in ein reguläres exit 0


    Allgemein wäre es denk ich übersichtlicher wenn das Script so aussähe:


    Wie sieht dein /etc/sudoers Eintrag für www-data aus?


    Guck mal hier:

    Code
    root@RoPi:/usr/src/rcswitch-pi# /usr/local/bin/send433 $2 $3 $4 ; echo $? 
    sending systemCode[(null)] unitCode[0] command[0]
    Speicherzugriffsfehler
    139
    root@RoPi:/usr/src/rcswitch-pi#
    root@RoPi:/usr/src/rcswitch-pi# /usr/local/bin/send433 11111 11 1 ; echo $?        
    sending systemCode[11111] unitCode[11] command[1]
    Speicherzugriffsfehler
    139
    root@RoPi:/usr/src/rcswitch-pi#


    Stell also mal sicher das die Parameter auch wirklich übergeben werden und richtig sind ;)
    (ich habe nichts angeschlossen)

  • Meine sudoers sieht wie folgt aus:

    Code
    www-data ALL=NOPASSWD:/var/sudowebscript.sh


    Was ich allerdings sehr komisch finde, ist der nachfolgende Code/Befehle:


    Ich bin als root angemeldet. Ohne sudo geht es nicht, mit sudo funktioniert es? :s


    Was mache ich nur falsch...