PHP aus PHP heraus mit exec ausfuehren?

PHP aus PHP heraus mit exec ausfuehren?

am 27.10.2006 12:45:15 von Holger Pollmann

Hallo,

folgendes Problem: da ich weder lokal PHP installiert habe noch das
möchte, wollte ich mir ein PHP-Skript schreiben, dem ich eine Datei
übergebe und das diese dann unter Angabe der lint-Option -l an PHP
übergibt, um mir dann zu sagen, ob das ganze syntaktisch korrekt ist.

Das Beispiel, an dem ich mich orientiere, ist unter
http://www.meandeviation.com/tutorials/learnphp/php-syntax-c heck/
zu finden.

Mein Problem ist nur: irgendwie funktioniert das nicht. Selbst, nachdem
ich den safe-mode mal probeweise ausgeschaltet habe und nun sogar
shell_exec() aufrufen kann, passiert immer das selbe: dr Output, den ich
nach dem exec()-Aufruf zurückbekomme, enthält die Ausgabe, die das
aufgerufene PHP-Skript generieren würde, wenn es ohne jegliche Parameter
aufgerufen würde.

Erläuterung: mein Skript soll mit einer Datei aufgerufen werden, die in
einem Form-Element mit dem name "phpfile" übergeben wird. Zu Anfang in
meinem Skript steht also

$upload_name = $_FILES["phpfile"]['tmp_name'];

Der Output, der sich in $output befindet, wenn ich
exec($cmd, $output, $result);
aufrufe ($cmd ist sowas wie "/usr/local/bin/php -l /path/to/test.php"),
enthält dann
$output[0] = "X-Powered-By: PHP/4.4.1 Content-type: text/html";
$output[1] = "Notice: Undefined index: phpfile in "
."/path/to/syntaxchecker/script.php on line 1";

Für mich sieht das so aus, als würde PHP nochmal aufgerufen, um das
aktuell ausgeführte Skript nochmal auszuführen, und zwar vollkommen
unabhängig davon, was ich nach dem Aufruf von php in $cmd so stehen habe;
auch ein "/usr/local/bin/php -v" erzeugt das ganze.

Als weiteren Test habe ich eine leere PHP-Datei erzeugt, in der
ausschließlich steht:

passthru('php -v');
die("File given!");
} else die("No file given!"); ?>

Der Aufruf dieser Datei unter Übergabe einer entsprechenden Datei in
einem Datei-Vormularfeld mti Namen phpfile ergibt folgenden Output:

X-Powered-By: PHP/4.4.1
Content-type: text/html

No file given!File given!

Und jetzt weiß ich echt nicht weiter. Auf dem Server läuft Apache, php
ist als Modul konfiguriert, soweit ich das sehen kann, ist die in
/usr/local/bin vorhandene PHP-Version die CGI-Version, und wenn ich
php -l /path/to/file.php
aus einer Shell (SSH über PuTTY, ist serverseitig zsh) aufrufe, dann
passiert genau das, was passieren soll. Ach, und die PHP-CGI-Datei hat
als Rechte 777 gesetzt, ist also definitiv ausführbar.

Ich habe echt lange gesucht, aber irgendwie keine Lösung gefunden.
Vielleicht liegt es schlicht daran, daß PHP als Modul läuft? Aber sollte
nicht exec() (ich hab's auch mal mit popen() versucht) nicht das ganze in
einem anderen Prozeß laufen lassen, bzw. müßte nicht spätestens
shell_exec() das tun, so daß das keine Rolle spielen sollte?

Über Gedanken zu meinem Problem wäre ich dankbar; gerne auch zu
Hinweisen, wie ich mein Ziel (PHP-Syntax-Checker) anders erreichen kann,
ohne PHP und einen Apache zu installieren.

--
( ROT-13 if you want to email me directly: uvuc@ervzjrexre.qr )
"Sie tragen Trauer? Der Untergang der DDR?" - "Nein, Leni Riefenstahl.
Der Führer hat sie zu sich genommen." -- Abschiedsshow Scheibenwischer,
02.10.2003

Re: PHP aus PHP heraus mit exec ausfuehren?

am 27.10.2006 13:09:41 von GreenRover

Holger Pollmann schrieb:
> exec($cmd, $output, $result);
> aufrufe ($cmd ist sowas wie "/usr/local/bin/php -l /path/to/test.php"),

$cmd = "/usr/local/bin/php -l /path/to/test.php";
$cwd = "/path/to/";
$env = array('some_option' => 'aeiou');


############################################################ #############

$descriptorspec = array(
0 => array("pipe", "r"), // stdin
1 => array("pipe", "w"), // stdout
2 => array("pipe", "r") // stderr
);


$process = proc_open($cmd, $descriptorspec, $pipes, $cwd, $env);

$out = '';
$err = '';

if (is_resource($process))
{
fclose($pipes[0]);

while (!feof($pipes[1]))
$out.=fgets($pipes[1]);
fclose($pipes[1]);

while (!feof($pipes[2]))
$err.=fgets($pipes[2]);
fclose($pipes[2]);

$return_value = proc_close($process);

#echo "command returned $return_value\n";
}

echo "RETURN: $out\n\n\n\nERROR: $err";

Re: PHP aus PHP heraus mit exec ausfuehren?

am 27.10.2006 14:21:46 von Holger Pollmann

"Heiko (GreenRover) Henning" schrieb:

> $process = proc_open($cmd, $descriptorspec, $pipes, $cwd, $env);

Sorry, mein Fehler: PHP 4.4.1.



Wenn ich das ganze also mit
$process = proc_open($cmd, $descriptorspec, $pipes);
mache, bekomme ich:

------------------------------------------------------------ ------------
RETURN: X-Powered-By: PHP/4.4.1
Content-type: text/html

RETURN: X-Powered-By: PHP/4.4.1
Content-type: text/html

[... insgesamt 144 mal]



Warning: proc_open(): unable to create pipe Too many open files
in system in /kunden/116502_35440/webseiten/blog/PHPSyntaxChecker/do-
syntax-check.php
on line 56

RETURN:



ERROR:



ERROR:


[... das ERROR kommt auch insgesamt 145 mal]
------------------------------------------------------------ ------------

Ich hatte ja schon gesagt, daß ich es zumindest mit popen() schon
probiert hatte. Aber trotzdem danke, es lag also nicht etwa nur daran,
daß ich zu faul war, mich in proc_open() einzulesen...

--
( ROT-13 if you want to email me directly: uvuc@ervzjrexre.qr )
"Sie tragen Trauer? Der Untergang der DDR?" - "Nein, Leni Riefenstahl.
Der Führer hat sie zu sich genommen." -- Abschiedsshow Scheibenwischer,
02.10.2003

Re: PHP aus PHP heraus mit exec ausfuehren?

am 27.10.2006 14:35:32 von GreenRover

Holger Pollmann schrieb:
> [... das ERROR kommt auch insgesamt 145 mal]
> ------------------------------------------------------------ ------------
>
> Ich hatte ja schon gesagt, daß ich es zumindest mit popen() schon
> probiert hatte. Aber trotzdem danke, es lag also nicht etwa nur daran,
> daß ich zu faul war, mich in proc_open() einzulesen...
>
Das schaut eher so aus, als hättest du ein größeres Problem mit deiner/n
Schleife.

PS hast du überhaupt mal versucht den $cmd string ausgeben zu lassen und
überprüft, ob dieser direkt auf der console läuft?

Ps hat der User unter dem PHP läuft überhaupt bin/bash rechte oder etwa
bin/false ??

Re: PHP aus PHP heraus mit exec ausfuehren?

am 27.10.2006 14:49:14 von Holger Pollmann

"Heiko (GreenRover) Henning" schrieb:

>> [... das ERROR kommt auch insgesamt 145 mal]
>> ------------------------------------------------------------ --------
>> ----
>>
>> Ich hatte ja schon gesagt, daß ich es zumindest mit popen() schon
>> probiert hatte. Aber trotzdem danke, es lag also nicht etwa nur
>> daran, daß ich zu faul war, mich in proc_open() einzulesen...
>
> Das schaut eher so aus, als hättest du ein größeres Problem mit
> deiner/n Schleife.

Wenn du mit "Schleife" die Tatsache meinst, daß anscheinend eben der
eigentlich externe PHP-Aufruf trotz allem einfach nochmal das aufrufende
Skript abarbeitet (statt das Kommando abzuarbeiten, das gegeben wurde),
dann stimme ich dir zu, denn das ist ja mein Problem, das ich einfach
nicht verstehe.

> PS hast du überhaupt mal versucht den $cmd string ausgeben zu lassen
> und überprüft, ob dieser direkt auf der console läuft?

Jup. Exakt so.

> Ps hat der User unter dem PHP läuft überhaupt bin/bash rechte oder
> etwa bin/false ??

Der PHP-User ist derselbe User wie der Shell-User. Da ich in der Shell
den Aufruf problemlos machen kann, müßte m.E. auch das PHP-Skript das
Recht dazu haben, wenn es über den Server ausgeführt wird.

Andere Sachen scheinen auch zu funktionieren; wenn ich eine Datei mache,
in der nur

passthru('whoami');

steht, dann bekomme ich richtig die ID des Users ausgegeben.

--
( ROT-13 if you want to email me directly: uvuc@ervzjrexre.qr )
"Sie tragen Trauer? Der Untergang der DDR?" - "Nein, Leni Riefenstahl.
Der Führer hat sie zu sich genommen." -- Abschiedsshow Scheibenwischer,
02.10.2003

Re: PHP aus PHP heraus mit exec ausfuehren?

am 27.10.2006 14:59:38 von GreenRover

Holger Pollmann schrieb:
> Wenn du mit "Schleife" die Tatsache meinst, daß anscheinend eben der
> eigentlich externe PHP-Aufruf trotz allem einfach nochmal das aufrufende
> Skript abarbeitet (statt das Kommando abzuarbeiten, das gegeben wurde),
> dann stimme ich dir zu, denn das ist ja mein Problem, das ich einfach
> nicht verstehe.

Stell mal sonst einfach die source online.

Re: PHP aus PHP heraus mit exec ausfuehren?

am 28.10.2006 22:05:03 von Holger Pollmann

"Heiko (GreenRover) Henning" schrieb:

>> Wenn du mit "Schleife" die Tatsache meinst, daß anscheinend eben
>> der eigentlich externe PHP-Aufruf trotz allem einfach nochmal das
>> aufrufende Skript abarbeitet (statt das Kommando abzuarbeiten, das
>> gegeben wurde), dann stimme ich dir zu, denn das ist ja mein
>> Problem, das ich einfach nicht verstehe.
>
> Stell mal sonst einfach die source online.

Dein Code aus <4541e8f3$0$5711$9b4e6d93@newsspool3.arcor-online.net> mit
einem drumherum und den tatsächlichen Pfaden eingesetzt,
reduziert um den Teil mit $cwd und $env, erzeugt bereits den von mir in
<4qebuqFmmefkU1@individual.net> geposteten Output. Ohne jegliche
Zusätze.

(Na ja, nicht ganz. Die Warning über die too many pipes kommt nicht.)

Source wäre also (Pfade unkenntlich gemacht):
------------------------------------------------------------ ------------

$cmd = "/usr/local/bin/php -l /path/to/filephp";

$descriptorspec = array(
0 => array("pipe", "r"), // stdin
1 => array("pipe", "w"), // stdout
2 => array("pipe", "r") // stderr
);

$process = proc_open($cmd, $descriptorspec, $pipes);

$out = '';
$err = '';

if(is_resource($process)){
fclose($pipes[0]);

while(!feof($pipes[1]))
$out.=fgets($pipes[1]);
fclose($pipes[1]);

while(!feof($pipes[2]))
$err.=fgets($pipes[2]);
fclose($pipes[2]);

$return_value = proc_close($process);
}

echo "RETURN: $out\n\n\n\nERROR: $err";

?>
------------------------------------------------------------ ------------

--
( ROT-13 if you want to email me directly: uvuc@ervzjrexre.qr )
"Das saarl. VwVfG läßt eine Interpretation deutscher Gesetze nur dann
zu, wenn sie nicht eindeutig sind." Manfred Saar, Präsident
Apothekerkammer d. Saarlandes. heute-journal v. 8. August 2006.

Re: PHP aus PHP heraus mit exec ausfuehren?

am 31.10.2006 15:24:07 von Holger Pollmann

Holger Pollmann schrieb:

> Ich habe echt lange gesucht, aber irgendwie keine Lösung gefunden.
> Vielleicht liegt es schlicht daran, daß PHP als Modul läuft?

Nach viel Rumprobieren sieht meine "Lösung" jetzt so aus, daß ich eine
entsprechende PHP-CLI-Binary gefunden habe, die ich in das gewünschte
Verzeichnis stelle und mittels "./php -l ..." aufrufe, Nicht unbedingt
schon, aber es läuft.

--
( ROT-13 if you want to email me directly: uvuc@ervzjrexre.qr )
"Sie tragen Trauer? Der Untergang der DDR?" - "Nein, Leni Riefenstahl. Der
Führer hat sie zu sich genommen." -- Abschiedsshow Scheibenwischer,
02.10.2003