Ankündigung

Einklappen
Keine Ankündigung bisher.

kann exec() nicht ausführen Fehler127

Einklappen

Neue Werbung 2019

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

  • kann exec() nicht ausführen Fehler127

    Hallo, ich wollte mit exec convert von imagemagick aufrufen. das lief nicht und ich hbe nichtmal eine Fehlemeldung erhalten, egal was ich versucht habe.

    Nun habe ich mal zum testen das hier benutzt

    PHP-Code:
    exec("/usr/bin/whoami"$output$error);
    if (
    $error) echo ("OS Error: $error.<br />\n");
    echo 
    implode("<br />"$output); 
    Ich erhalte nur OS Error: 127

    Was bedeutet diser Fehler und kann mir einer sagen wieso das nicht läuft?

    Vielen Dank

  • #2
    Hallo ensacom,
    Fehlercode 127 heißt afair soviel wie "command not found", also dass das Kommando nicht gefunden wurde. Stimmen die Pfade?

    Wenn man sich unter PHP: passthru - Manual die user contributed notes anschaut, kann's aber auch heißen, dass du nicht die nötigen Rechte hast...
    [URL="https://www.quizshow.io/"]Create your own quiz show.[/URL]

    Kommentar


    • #3
      Ok dank, ich habe gerade mit dem Provider geredet und der kann mir auch nichts dazu sagen.

      Die rechte von was genau müssen denn da fürwen gesetzt werden?
      Es ist ein Server auf dem Suse läuft.

      Kommentar


      • #4
        Also whoami soll da sein sagt der Provider.
        Die Pfade sollen stimmen und die rechte sehen so aus


        -rwxr-xr-x 1 root root 19944 Nov 25 2006 whoami

        Woran kann es nun noch liegen?

        Kommentar


        • #5
          Es könnte auch sein, dass in der PHP-Konfiguration safe_mode auf "on" ist, dann kann exec() auch nicht verwendet werden. Aber dann sollte die Fehlermeldung eigentlich anders aussehen.

          Kommentar


          • #6
            exec/passthru zeigen nur stdout an. Die Fehlermeldung werden aber über stderr ausgegeben. Mit 2>&1 wird stderr auf stdout umgeleitet.
            which command durchsucht alle Pfade in $PATH nach command und gibt den ersten Treffer aus; oder nichts, wenn command nicht gefunden wird.
            PHP-Code:
            echo 'which whoami: ';
            passthru("which whoami 2>&1");
            echo 
            "\n exec: ";
            passthru("/usr/bin/whoami 2>&1"); 

            Kommentar


            • #7
              Das Problem hat sich wohl mittlerweile erledigt: kann exec() nicht ausführen Fehler127 - phpfriend.de

              Leider hielt es ensacom wohl nicht für nötig uns das mitzuteilen...
              [URL="https://www.quizshow.io/"]Create your own quiz show.[/URL]

              Kommentar


              • #8
                Zitat von Montellese Beitrag anzeigen
                Es könnte auch sein, dass in der PHP-Konfiguration safe_mode auf "on" ist, dann kann exec() auch nicht verwendet werden. Aber dann sollte die Fehlermeldung eigentlich anders aussehen.
                crossposting ftw

                Kommentar


                • #9
                  Naja wenigstens hatte ich recht ^^

                  Kommentar


                  • #10
                    Problem besteht auch ohne safe_mode

                    Hallo!

                    Ich habe leider das gleiche problem wie auch ensacom. Leider scheint es bei mir nicht am safe_mode zu liegen.

                    Ich moechte von PHP ein Programm starten lassen, das ich selbst geschrieben habe (C++) und das in einem Unterverzeichnis von /usr/local/bin liegt. Die Rechte stehen auf:

                    Code:
                    -rwxr-xr-x 1 root root
                    Ausserdem kann ich das Programm von der Shell aus starten, wenn ich mich als user 'www-data' (der user, als der Apache fungiert) einlogge. Ein anderes Programm, das im selben Verzeichnis liegt und nichts weiter tut, als 'Hallo Welt!' auszugeben, funktioniert auch mit PHP (ich rufe immer das Skript in Firefox auf). Befehle wie 'whoami', 'ls' etc. gehen auch problemlos.

                    Wenn ich mit

                    Code:
                    exec("/usr/local/bin/xyz/parser",$out,$err);
                    echo "Error Code: $err ";
                    das Programm aufrufe, dann erhalte ich den Error Code 127 (wie bei ensacom). Andere Befehle liefern hier wie gesagt die 0 und funktionieren normal.

                    Woran kann es liegen? Laut phpinfo() stehen beim safe_mode sowohl 'Local Value' als auch 'Master Value' auf 'Off'. Wisst ihr, ob man mit safe_mode oder einer anderen Funktion nur bestimmte Befehle verbieten kann? Ich dachte, es waere eine Rechte-Sache, aber nach langer Suche habe ich immer noch nichts gefunden. In einem Forum las ich etwas ueber den Fehler, dass die /bin/bash keine execute Rechte hatte. Ist bei mir nicht der Fall.

                    Vielleicht liegt es doch an der Konfiguration von apache.

                    Kann mir jemand von Euch weiterhelfen?

                    LG

                    Kommentar


                    • #11
                      Zitat von deeg Beitrag anzeigen
                      crossposting ftw
                      jetzt nichtmehr

                      @uriuri: ist open_basedir an?
                      [B]PHP4?!?[/B]>>>[B]Aktuelle[/B] PHP Version: [B]5.2.11 || 5.3.0
                      [URL="http://en.opensuse.org/Factory/News"]Suse 11.2 *vorfreude*[/URL]
                      [/B]

                      Kommentar


                      • #12
                        Sorry, dass ich noch nicht geantwortet habe.

                        Ich habe leider erst wieder am Donnerstag die Gelegeneheit, was an dem Server auszuprobieren. Ich kann also nicht nachschauen, ob 'open_basedir' an ist. Ich glaube aber nicht, dass das Programm im falschen Verzeichnis liegt. Ich glaube ich habe versucht, es vom Document Root aus zu starten. Das ging ebenso wenig. Außerdem bezieht sich doch open_basedir nur auf das Öffnen von Dateien, nicht auf das Ausführen von Programmen, oder?

                        Vielen Dank trotzdem für den Hinweis.

                        Sonst noch einer 'ne Idee?

                        Kommentar


                        • #13
                          Und auch hier mal stderr auf stdout umleiten
                          PHP-Code:
                          echo "start ";
                          passthru("/usr/local/bin/xyz/parser 2>&1");
                          echo 
                          "ende "
                          Wird so eine Fehlermeldung ausgegeben?

                          Kommentar


                          • #14
                            Fehler gefunden

                            Danke, Leute, ich hab den Fehler gefunden!

                            Es war doch ein bisschen anders als zunaechst gedacht:

                            Der Tipp mit der Ausgabe von stderr war super. So habe ich herausgefunden, dass die Datei 'libCore.so' nicht gefunden werden konnte. Diese ist, wie ich dann gemerkt habe, Bestandteil des Programms ROOT, das ich in mein C++-Programm eingebunden hatte. Mir war dann schnell klar, dass die Umgebungsaviablen falsch gesetzt sein muessen. ROOT braucht naemlich einen Eintrag mit seinem lib-Verzeichnis in der env var $LD_LIBRARY_PATH. Dieser war aber nicht vorhanden, wie durch
                            PHP-Code:
                            passthru("echo $LD_LIBRARY_PATH"); 
                            herauszufinden war. Also habe ich noch ein bisschen gesucht, wo denn die Variablen gesetzt werden muessen. Nach einiger Zeit stiess ich auf die Datei /etc/apache2/envvars und habe dort mit
                            Code:
                            ...
                            export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ROOTSYS/lib
                            ...
                            die noetige(n) Variable(n) gesetzt. Nach Neustart von apache2 hat's funktioniert!

                            Mich wundert nur, warum ich letzte Woche nicht den Fehler mit der 'libCore.so' an der Shell bekommen habe. Der kam nun naemlich auch an der Shell, wenn ich als Benutzer www-data eingeloggt war. Irgendwie muessen die Env Vars da noch exportiert worden sein, denn an der Shell konnte ich das Programm ausfuehren, aber mit PHP wiederum nicht.

                            Jetzt ist es genau umgekehrt: Mit PHP geht's, an der Shell aber nicht. Irgendwie muss es einen Unterschied geben zwischen dem User www-data, der von Apache benutzt wird, und dem User www-data, der an der Shell eingeloggt ist. Ist auch irgendwie klar, dass man nicht die Env Vars aus /etc/apache2/envvars bekommt, wenn man sich in die Bash einloggt.

                            Naja, ich hoffe, es klappt jetzt einwandfrei.

                            LG

                            Kommentar


                            • #15
                              Ja, es gibt einen Unterschied, den ich Dir nur leider nicht aus dem Ärmel schütteln kann - meine Unix/Linux Kenntnisse sind begrenzt.
                              Such mal danach, welche Startdateien für interaktive/nicht-interaktive Sessions ausgeführt werden und welche Unterschiede es zu anderen Diensten/Prozessen gibt. Wenn Du Dich am Terminal anmeldest, arbeitet die Shell einige Dateien ab. Das passiert für den Apache daemon nicht - oder anders.

                              Kommentar

                              Lädt...
                              X