shell_exec path-variable nicht aus environment?

Irgendwelche Probleme mit XAMPP für Linux? Dann ist hier genau der richtige Ort um nachzufragen.

shell_exec path-variable nicht aus environment?

Postby Mojo78 » 13. November 2011 21:06

Hi Leute,
ich habe in einer Virtual Box ein Xubuntu 10.04 LTS laufen mit einem xampp für Linux 1.7.3a. Es sind verschiedene Virtual-Hosts konfiguriert.

in xampp ist ja ein php-cli bei, und zwar:
/opt/lampp/bin/php

Nun habe ich folgendes Problem.
Ich habe /etc/environment den Pfad /opt/lampp/bin/ hinzugefügt, damit ich in von php aus (wie auf meinem Online-Server) den php-cli ohne Pfad aufrufen kann:
shell_exec('php script.php');
...das funktioniert jedoch nicht.
Ich muss immer den kompletten Pfad zu php mit eingeben, damit mein script läuft, also:
shell_exec('/opt/lampp/bin/php script.php');

Nun habe ich etwas nachgeforscht:
alle User (inkl. root) haben in der shell /opt/lampp/bin/ im Pfad.

Wenn ich jedoch in php schaue, ist beim ausführenden user (nobody) /opt/lampp/bin/ nicht im Pfad. Überhaupt sieht der Pfad von nobody etwas anders aus:
root & andere user: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/lampp/bin
nobody: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

Wird die Variable Pfad irgendwo noch überschrieben?

Komische Sache. Ich habe mal direkt nach "/usr/X11R6/bin" gesucht:
grep -r -l /usr/X11R6/bin /opt/* 2>/dev/null
Ergebnis:
/opt/lampp/tidy/config.log
/opt/lampp/tidy/console/tidy
/opt/lampp/tidy/console/tab2space

in /opt/lampp/tidy/console/tidy ist eine Zeile drin:
Code: Select all
relink_command="(cd /opt/lampp/tidy/console; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin; export PATH; gcc -O2 -Wall -O2 -o \$progdir/\$file tidy.o  ../src/.libs/libtidy.so -Wl,-rpath -Wl,/opt/lampp/tidy/src/.libs)"

... und in In tab2space:
Code: Select all
relink_command="(cd /opt/lampp/tidy/console; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin; export PATH; gcc -O2 -Wall -O2 -o \$progdir/\$file tab2space.o  ../src/.libs/libtidy.so -Wl,-rpath -Wl,/opt/lampp/tidy/src/.libs)"


In beiden Files wird PATH gesetzt. Komisch. Werden die Files überhaupt ausgeführt? Ich werde aus dem ganzen nicht schlau. Warum sollte tidy PATH überschreiben? und warum relink_command?

Ich habe tidy, wenn ich mich recht entsinne, mal nachinstalliert, weil es in xampp nicht drin war.
Das scheint mir auch kein File zu sein, das zur manuellen Konfiguration gedacht ist - ob es so schlau ist darin rumzupfuschen? Oder ob das nicht doch noch an anderer Stelle gesetzt wird?

Ich hoffe Ihr könnt mir helfen,
ich habe schon im phpforum.de (http://phpforum.de/forum/showthread.php?p=1487961#post1487961) gepostet, aber leider scheint das ein xampp-spezifisches Problem zu sein?
Bye, Mojo
Mojo78
 
Posts: 10
Joined: 11. March 2010 12:41

Re: shell_exec path-variable nicht aus environment?

Postby Nobbie » 13. November 2011 22:29

Mojo78 wrote:aber leider scheint das ein xampp-spezifisches Problem zu sein?


Richtig.

Wie steht es insgesamt um deine Linux Kenntnisse?
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Re: shell_exec path-variable nicht aus environment?

Postby Mojo78 » 13. November 2011 23:24

Ich habe leider nur Linux-Grundkenntnisse, die erweitern sich allerdings mit jedem Problem was auftritt.
Mojo78
 
Posts: 10
Joined: 11. March 2010 12:41

Re: shell_exec path-variable nicht aus environment?

Postby Nobbie » 14. November 2011 17:31

Eigentlich wollte ich empfehlen, für Apache einen anderen User als nobody zu wählen, aber insgesamt erscheint mit die Lösung dem Problem nicht angemessen.

Da solche Scripts ja auch auf Servern laufen sollen, die nicht unter der eigenen Kontrolle stehen, würde ich empfehlen, nicht das Environment resp. die PATH Variable zu bemühen, sondern im Kopf des jeweiligen Scripts (oder auch ausgelagert in einer config.inc.php o.ä.) eine Variable (oder auch Konstante) zu definieren, deren Inhalt auf den lokalen PHP Interpreter (mit vollem Pfadnamen) verweist. Dann Im Script selbst wird dann nur mit dieser Variablen/Konstanten gearbeitet und man muss dann, je nach Umgebung, nur diese Variable anpassen:

Code: Select all
<?php
    $phpcli = '/opt/lampp/bin/php';

     ...

    shell_exec($phpcli.' script.php');
?>


bzw. mit einer Konstanten und gleichzeitig ausgelagert in einer config-Datei:

Code: Select all
<?php
    include 'config.inc.php';

     ...

    shell_exec(PHP_CLI.' script.php');
?>


und in config.inc.php:

Code: Select all
<?php
    define('PHP_CLI', '/opt/lampp/bin/php');

    ....
?>


Da könnte dann beispielsweise für eine Windows Umgebung auch dieses drin stehen:

Code: Select all
<?php
    define('PHP_CLI', 'c:/xampp/bin/php_cli.exe');

    ....
?>


Dann braucht das eigentliche Script nie angepasst zu werden, sondern nur die config-Datei (ähnlich wie bei phpMyAdmin).

Der Vollständigkeit halber will ich anmerken, dass das insgesamt etwas merkwürdig aussieht, denn PHP kann natürlich auch direkt von Apache ausgeführt werden, anstatt mit shell_exec() gestartet zu werden. Dazu benötigt man überhaupt keine Kenntnisse, wie und wo PHP installiert ist, das wird bei der Apache Installation angegeben. Auch die Ausgaben des Scripts ließe sich einfach abfangen, falls es notwendig wäre. Da wir hier nicht wissen, was da ausgeführt wird und wieso es so herum ausgeführt wird, kann ich auch nicht weiter darauf eingehen.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Re: shell_exec path-variable nicht aus environment?

Postby Mojo78 » 15. November 2011 09:18

danke für die Antwort.
Der (Managed) Server, auf dem ich das Script ausführe erlaubt nur Chron-Jobs, die direkt eine URL aufrufen. Die Komponente erwartet jedoch Parameter. Also führe ich per Chronjob ein Script aus, in welchem die Parameter für die Komponente definiert werden. Außerdem finde ich es auch ganz schön, mehrere per chronjob auszuführenden Tasks in einem Script zu haben. Daher der Umweg über shell_exec.

$commands['export1']='php ./components/com_csvimproved/helpers/cron.php username="cronuser" passwd="mypw" template_name="mytmpl"';

Das $PATH-Problem ist im Grunde kein Großes Problem, momentan ist ein cfg-file praktisch überflüssig, da es sich nur um das eine Script für den eigenen Server handelt.
Daher werde ich das so lösen, einfach mit eine Konstante PHP-CLI.

Den Apache-ausführenden User wechseln... Ich könnte mir vorstellen, dass ich da wieder in eine Reihe Berechtigungsprobleme o.ä. renne? Aber eigentlich möchte ich das auch gar nicht: Ich sollte doch die Umgebungsvariable für nobody auch in der Hand haben!?

Wo und wie der $PATH manipuliert wird weiß niemand? Oder habe ich da ein allgemeines Verständnis-Problem zum User nobody? Ansonsten würde es mich wirklich brennend interessieren, wo, wieso und warum $PATH für nobody überschrieben wird.

Ciao, Mojo
Mojo78
 
Posts: 10
Joined: 11. March 2010 12:41

Re: shell_exec path-variable nicht aus environment?

Postby Nobbie » 15. November 2011 14:24

Mojo78 wrote:Wo und wie der $PATH manipuliert wird weiß niemand?


Doch, das wissen viele. Das Problem ist, dass diese Variable an vielen Stellen gesetzt und überschrieben werden kann und das ist auch noch abhängig von der Shell, die standardmäßig ausgeführt wird. Und es ist (wie alles unter Linux) von der Distribution abhängig. Der Eintrag in /etc/environment beispielsweise war mir noch gar nicht bekannt - ich glaube nicht, dass das bei allen Distributionen gleich ist.

Mojo78 wrote:Oder habe ich da ein allgemeines Verständnis-Problem zum User nobody?


Das ist auch durchaus möglich, ich habe mich ehrlich gesagt noch nie damit beschäftigt (obwohl ich seit vielen Jahren Unix kenne und betreibe). Der User "nobody" (der Niemand!) ist ein Sonderuser, ich weiß nicht einmal, ob man sich überhaupt als "nobody" einloggen kann (ich vermute, das geht nicht). Im Grunde ist das der kleinste User des Betriebssystems (wobei es den lange nicht immer gab - wann der aufgekommen ist, weiß ich auch nicht). Es ist durchaus möglich, dass "nobody" einige Standardprozeduren nicht durchläuft. Deswegen hatte ich die Idee, nicht nobody zu nehmen, sondern wwwrun (nur als Beispiel, diesen User gibt es bei vielen Massenhostern). Oder "apache", wird auch gern benutzt.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Re: shell_exec path-variable nicht aus environment?

Postby Mojo78 » 15. November 2011 19:42

Danke noch mal für die ausführliche Antwort. Ich denke ich werde es erst mal dabei belassen, wie gesagt ein großes Problem habe ich damit ja nicht.
Ich habe mal versucht mich als nobody einzuloggen, das hat nicht funktioniert - auch via google habe ich dazu nichts gefunden. Überhaupt ist es auf Grund der vielen versch. Distributionen und ich denke auch wegen der extremen Flexibilität vieler Linux-Helferlein (z.B. sendmail, argh) meiner Ansicht nicht so einfach sich zum Thema Linux-Server via google zu helfen - daher wäre es mir wichtig zumindest die grundsätzlichen Herangehensweisen an die gängigsten Probleme auch halbwegs zu verstehen.
Bye, Mojo
Mojo78
 
Posts: 10
Joined: 11. March 2010 12:41


Return to XAMPP für Linux

Who is online

Users browsing this forum: No registered users and 4 guests