MSUser: exec() trotz safe_mode=Off rätselhaft

Hallo,

ich versuche eine ausführbare Datei in "/usr/bin" mit exec() auszuführen.
Konkret
exec("/usr/bin/pdftex"...);
Dabei erhalte ich
"No such file or directory"
als Fehler.
Laut phpinfo() ist safe_mode=Off, ich kann auch mittels chdir() nach "/usr/bin" wechseln.
Server: Apache/2.2.9 (Debian) mit PHP/5.2.6-1

Ich verstehe leider nicht, was hier schief läuft. Google spuckte keine funktionierende Lösung aus. Anscheinend liegt ein Pfadproblem vor, doch ich komme nicht dahinter, wie ich es löse.

Schöne Grüße
MSUser

  1. Moin!

    ich versuche eine ausführbare Datei in "/usr/bin" mit exec() auszuführen.
    Konkret
    exec("/usr/bin/pdftex"...);

    Das ist kaum der komplette Befehl.

    Ansonsten: file_exists()? is_executable()? Kommandozeile mal außerhalb generieren lassen, dabei korrektes Escaping für Variablen benutzt, und manuell in der Shell getestet?

    - Sven Rautenberg

    1. Hallo,

      Ansonsten: file_exists()? is_executable()? Kommandozeile mal außerhalb generieren lassen, dabei korrektes Escaping für Variablen benutzt, und manuell in der Shell getestet?

      den gesamten Befehl habe ich in einer Shell getestet, dort funktioniert er, jedoch <nicht> manuell "php dasFile.php" drüberlaufen lassen, da ich offenbar als angemeldeter User keinen Zugriff auf das Executable-File von php habe (kann php nicht lokalisieren, ein find in / liefert nur ein paar php-Files).

      In PHP ist is_executable() sowie file_exists() beides false.

      Danke und schöne Grüße,
      MSUser

      1. Tach,

        In PHP ist is_executable() sowie file_exists() beides false.

        klingt als liefe PHP in einer Sandbox (chroot, jail, …)

        mfg
        Woodfighter

      2. Hello,

        In PHP ist is_executable() sowie file_exists() beides false.

        Und der Pfad zur Befehlsdatei stimmt auch wirklich?

        Wird PHP als Modul oder als CGI/FastCGI ausgeführt?

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hallo,

          Und der Pfad zur Befehlsdatei stimmt auch wirklich?

          als "normaler" User eingeloggt kann ich "/usr/bin/pdflatex" ausführen, "which" hat mir diesen Pfad geliefert. Es scheint also ein Problem zu geben, wenn der www-data oÄ. auf die Pfade zugreifen will.

          Wird PHP als Modul oder als CGI/FastCGI ausgeführt?

          Gute Frage - Apache 2.0 Handler steht als Server API in phpinfo().

          Schöne Grüße,
          MSUser

          1. Hello,

            Wird PHP als Modul oder als CGI/FastCGI ausgeführt?

            Gute Frage - Apache 2.0 Handler steht als Server API in phpinfo().

            Also als Handler des Apache == Modul

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
      3. Moin!

        In PHP ist is_executable() sowie file_exists() beides false.

        Und du wunderst dich noch, das es nicht geht?

        PHP sieht die Datei nicht, sie ist auch nicht ausführbar. Also muss exec() scheitern.

        - Sven Rautenberg

        1. Hallo,

          Und du wunderst dich noch, das es nicht geht?

          Mich wundert nicht unbedingt, dass exec() nicht geht, sondern vielmehr, dass die Files trotz absoluter Pfadangabe nicht gefunden und damit nicht ausgeführt werden.

          Schöne Grüße,
          MSUser

  2. Hello,

    ich versuche eine ausführbare Datei in "/usr/bin" mit exec() auszuführen.
    Konkret
    exec("/usr/bin/pdftex"...);
    Dabei erhalte ich
    "No such file or directory"
    als Fehler.

    Bekommst Du das als Rückgabewert von Exec oder als Fehlermeldung von PHP?
    Das ist ein großer Unterschied.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hallo,

      Bekommst Du das als Rückgabewert von Exec oder als Fehlermeldung von PHP?
      Das ist ein großer Unterschied.

      als Rückgabewert von Exec, PHP sagt leider nur einen leeren Text (?).

      Danke und schöne Grüße
      MSUser

      1. Hello,

        Bekommst Du das als Rückgabewert von Exec oder als Fehlermeldung von PHP?
        Das ist ein großer Unterschied.

        als Rückgabewert von Exec, PHP sagt leider nur einen leeren Text (?).

        Dann kann exec also entweder die Befehlsdatei nicht finden, oder aber die Befehlsdatei kann ihren Paramter nicht interpretieren. Da Du Augenscheinlich aber gar keinen Parameter übergeben hast, kann sie also eventuell nicht ohne Parameter arbeiten.

        Wenn die Befehlsdatei nicht ausführbar wäre für den PHP-Interpreter-Prozess, dann würde mMn eine andere Fehlermeldung kommen.

        Du solltest und ggf. auch den wirklichen Befehlsstring aus exec() nennen, wenn Du noch Hilfe benötigst. So kann der ja nicht stimmen!

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hallo,

          Dann kann exec also entweder die Befehlsdatei nicht finden, oder aber die Befehlsdatei kann ihren Paramter nicht interpretieren. Da Du Augenscheinlich aber gar keinen Parameter übergeben hast, kann sie also eventuell nicht ohne Parameter arbeiten.

          Wenn die Befehlsdatei nicht ausführbar wäre für den PHP-Interpreter-Prozess, dann würde mMn eine andere Fehlermeldung kommen.

          Du solltest und ggf. auch den wirklichen Befehlsstring aus exec() nennen, wenn Du noch Hilfe benötigst. So kann der ja nicht stimmen!

          ich vermute, dass php einfach nicht auf die entsprechenden Files zugreifen kann. Der ganze Befehl würde etwa lauten

          exec("/usr/bin/pdflatex ./testInput.tex");

          Schöne Grüße,
          MSUser