Split: shell_exec

Hallo,

der Befehl

$str = 'cp /home/TAR/new /home/TAR/new_backup';
shel_exec("$str");

wird nicht ausgeführt.

  1. gudn tach!

    der Befehl

    $str = 'cp /home/TAR/new /home/TAR/new_backup';
    shel_exec("$str");

    wird nicht ausgeführt.

    moegliche antworten:
    1. hey, bei mir auch nicht.
    2. ooooch, du armer!
    3. und?
    4. helau!
    5. vielleicht liegt's ja auch nur am fehlenden 'l'?

    prost
    seth

    1. $str = 'cp /home/TAR/new /home/TAR/new_backup';
      shel_exec("$str");

      1. vielleicht liegt's ja auch nur am fehlenden 'l'?

      ich habe auch shell_exec in meinem script stehen.

  2. Hi!

    der Befehl

    Das ist kein Befehl, sondern eine Funktion.

    shel_exec("$str");
    wird nicht ausgeführt.

    Es gibt auch keine Funktion shel_exec().
    PHP kennt allerdings eine Funktion shell_exec().
    Vielleicht meinst du die?

    shel_exec("$str");

    Wozu die Doublequotes?

    Außerdem kann es schon gut sein, daß dein Hoster diese Funktion deaktivert hat.
    Und im Safe-Mode steht sie ohnehin nicht zur Verfügung.

    Schöner Gruß,
    rob

    1. shel_exec("$str");
      wird nicht ausgeführt.
      Es gibt auch keine Funktion shel_exec().
      PHP kennt allerdings eine Funktion shell_exec().
      Vielleicht meinst du die?

      Die meinte ich auch und die habe ich auch in meinem Script richtig stehen!

      shel_exec("$str");
      Wozu die Doublequotes?

      muss ich die Doublequotes nicht angeben?

      Außerdem kann es schon gut sein, daß dein Hoster diese Funktion deaktivert hat.
      Und im Safe-Mode steht sie ohnehin nicht zur Verfügung.

      deaktiviert ist sie nicht, da ich in einem anderem Script shell_exec ausführe und die funktioniert.

      1. Hi!

        Die meinte ich auch und die habe ich auch in meinem Script richtig stehen!

        OK.

        deaktiviert ist sie nicht, da ich in einem anderem Script shell_exec ausführe und die funktioniert.

        OK.

        Der Funktionsname ist also richtig geschrieben und die Funktion ist prinzipiell nutzbar.

        Das erkläre mal bitte, was "wird nicht ausgeführt" genau bedeutet.

        Bekommst du eine Fehlermeldung? Wenn ja, welche?
        Gibt dir shell_exec() denn irgendwas zurück?

        Und du hast auch die Dateirechte überprüft?
        Du hast ausreichend Rechte, um deine Datei von dem einen in das andere Verzeichnis zu kopieren?

        Schöner Gruß,
        rob

        1. Das erkläre mal bitte, was "wird nicht ausgeführt" genau bedeutet.

          Bekommst du eine Fehlermeldung? Wenn ja, welche?
          Gibt dir shell_exec() denn irgendwas zurück?

          Und du hast auch die Dateirechte überprüft?
          Du hast ausreichend Rechte, um deine Datei von dem einen in das andere Verzeichnis zu kopieren?

          die Dateirechte sind auf 777 gesetz.
          Ich kopiere es ja ins gleiche Verzeichnis?

          Hat es was mit den rechten vom Apache zu tun?

          Fehlermeldung bekomme ich keine. Es passiert einfach nichts.
          Ich öffne das Script drücke ausführen und nichts!!!!

          1. echo $begrüßung;

            Fehlermeldung bekomme ich keine. Es passiert einfach nichts.
            Ich öffne das Script drücke ausführen und nichts!

            Suche zunächst die Quelle des Fehlers. Eine Möglichkeit ist, ein

            die('irgend_ein_text'); // Der Text sollte aber nicht nur aus Ziffern bestehen.

            einzufügen. Wird der Text ausgegeben, ist noch alles in Ordnung. Verlagere dann das die() immer weiter nach hinten. Bleibt dann irgendwann die Ausgabe des Textes aus, liegt der Fehler im davor stehenden Teil.

            echo "$verabschiedung $name";

            1. die('irgend_ein_text'); // Der Text sollte aber nicht nur aus Ziffern bestehen.

              meinst du ich soll die

              nach
              $str = 'cp /home/TAR/new /home/TAR/new_backup';
              shell_exec("$str");

              schreiben?

              so?

              $str = 'cp /home/TAR/new /home/TAR/new_backup';
              shell_exec("$str");
              or die ('blablabla12345_=')

              1. Hi!

                so?

                $str = 'cp /home/TAR/new /home/TAR/new_backup';
                shell_exec("$str");
                or die ('blablabla12345_=')

                Nein. Semikolon ziwschen shell_exec() und or die() weglassen.
                Und warum hast die noch immer die Quotes um deine Variable?
                shell_exec( $str ) or die( "Fehler" );

                Außerdem könntest du es auch mal mit
                echo shell_exec();
                versuchen, um zu sehen, ob was ausgegeben wird.

                Schöner Gruß,
                rob

                1. gudn tach!

                  Außerdem könntest du es auch mal mit
                  echo shell_exec();
                  versuchen, um zu sehen, ob was ausgegeben wird.

                  evtl. waere dabei eine umleitung stderr2stdout sinnvoll, da php sonst nur die ausgabe von stdout ausspuckt.

                  $str = 'cp /home/TAR/new /home/TAR/new_backup 2>&1';  
                  echo `$str`;
                  

                  (backticks machen dasselbe wie shell_exec.)

                  prost
                  seth

                  1. Hi!

                    (backticks machen dasselbe wie shell_exec.)

                    Ja, aber wenn shell_exec() nicht funktioniert, weil es deaktiviert wurde oder weil PHP im Safe-Mode arbeitet, dann funktionieren die Backticks auch nicht.
                    Insofern wird die andere Schreibweise das Problem nicht beheben können.

                    evtl. waere dabei eine umleitung stderr2stdout sinnvoll, da php sonst nur die ausgabe von stdout ausspuckt.

                    Ja, das ist eine gute Idee.
                    Daran hatte ich eigentlich gedacht, als ich nach der Ausgabe von shell_exec() fragte.
                    Ich habe dabei allerdings gar nicht bedacht, daß diese, bei einem Fehler, ja nicht über Standardausgabe, sondern über Standarderror kommt.

                    Schöner Gruß,
                    rob

                    1. gudn tach!

                      (backticks machen dasselbe wie shell_exec.)
                      Ja, aber wenn shell_exec() nicht funktioniert, weil es deaktiviert wurde oder weil PHP im Safe-Mode arbeitet, dann funktionieren die Backticks auch nicht.

                      ja, das steht ja im verlinkten php-manual.
                      und abgesehen davon bedeutet "dasselbe" ja ebendies.

                      Insofern wird die andere Schreibweise das Problem nicht beheben können.

                      selbstverstaendlich nicht (hat ja auch niemand behauptet). ich benutze halt immer die backticks und wollte etwaigen fragen des OP vorbeugen, was diese seltsmen "anfuehrungszeichen" da bedeuten sollen. ;-)

                      evtl. waere dabei eine umleitung stderr2stdout sinnvoll, da php sonst nur die ausgabe von stdout ausspuckt.
                      Ja, das ist eine gute Idee.
                      Daran hatte ich eigentlich gedacht, als ich nach der Ausgabe von shell_exec() fragte.
                      Ich habe dabei allerdings gar nicht bedacht, daß diese, bei einem Fehler, ja nicht über Standardausgabe, sondern über Standarderror kommt.

                      das alles dachte ich mir und postete deswegen diesen tipp. :-)

                      prost
                      seth

                      1. Hallo Miteinander,

                        der Befehl wird jetzt ausgeführt. Fragt mich aber bitte nicht woran es lag. Ich habe ein wenig herumgespielt und es funktioniert jetzt.

                        Jetzt hab ich ein neues Problem:
                        mein script sieht jetzt so aus:

                        $str = "sed 's/.*main.script/Test/g' >/tmp/new_backup";
                        shell_exec('cp /tmp/new /tmp/new_backup');
                        shell_exec($str);

                        in diesem Fall ist die Datei new_backup leer.

                        Wenn ich es so probiere

                        $str = "sed 's/.*main.script/Test/g' >>/tmp/new_backup";
                        shell_exec('cp /tmp/new /tmp/new_backup');
                        shell_exec($str);

                        bleibt die Datei new_backup unverändert.

                        Ich hab es auch schon so probiert:
                        $str = 'sed 's/.*main.script/Test/g' >/tmp/new_backup';
                        .
                        .
                        hat auch nichts geholfen.

                        Könnt ihr mir weiterhelfen?

                        1. gudn tach!

                          Jetzt hab ich ein neues Problem:
                          mein script sieht jetzt so aus:

                          $str = "sed 's/.*main.script/Test/g' >/tmp/new_backup";
                          shell_exec('cp /tmp/new /tmp/new_backup');
                          shell_exec($str);

                          und was soll das script tun?

                          wenn du
                          sed 's/.*main.script/Test/g' > /tmp/new_backup

                          im cli ausfuehren wuerdest, koenntest du sachen eingeben, auf die dann der regexp angewendet wird. das ergebnis wuerde in /tmp/new_backup geschrieben.

                          in einem php-script macht sowas afais keinen sinn.

                          prost
                          seth

              2. echo $begrüßung;

                die('irgend_ein_text'); // Der Text sollte aber nicht nur aus Ziffern bestehen.
                meinst du ich soll
                $str = 'cp /home/TAR/new /home/TAR/new_backup';
                shell_exec("$str");
                or die ('blablabla12345_=')
                schreiben?

                Nein, so meinte ich das nicht. Also nochmal langsam:

                Füge ein

                die('test');

                als eigenständigen Ausdruck, nicht als Ergänzung zu etwas bereits bestehendem, in die erste Zeile nach dem <?php ein. Führe das Script aus. Es sollte die Ausgabe "test" zu sehen sein. Verlagere nun die die()-Zeile hinter die nächste vollständige Befehlszeile. Führe wieder das Script aus. Es sollte ein "test" zu sehen sein. Das Verlagern-und-Ausführen führst du solange aus, bis keine Ausgabe mehr kommt. Dann weißt du, es liegt an der Anweisung, die nun vor dem die() steht.

                Natürlich kann man diese Prozedur auch erst einmal in größeren Schriten anwenden. Sie dient dazu, den fehlerhaften Code(-Block) eindeutig zu identifizieren. Vielleicht liegt dein Problem ja wo ganz anders und nicht beim shell_exec().

                Wenn das shell_exec() ausgeführt wird, wäre dessen Rückgabewert interessant:

                var_dump(shell_exec($str));

                var_dump() erzeugt auf alle Fälle eine Ausgabe.

                echo "$verabschiedung $name";