shell_exec probleem
Ik heb een probleem met shell_exec. Ik krijg geen output terug. Ik heb op mijn linux server een executable qtdump. qtdump maakt een dump van alle atoms in een quicktime bestand.
Via SSH werkt het volgende wel:
./qtdump bestaatniet.mov => "Failed to open"
./qtdump bestaatwel.mov => dumpdata van de atoms
php dump.php => dumpdata van de atoms
* dump.php bevat echo shell_exec("./qtdump bestaatwel.mov");
Via shell_exec() werkt het volgende ook:
./qtdump bestaatniet.mov => "Failed to open"
Via shell_exec() werkt het volgende niet:
./qtdump bestaatwel.mov => geen data
bestaatniet.mov is een verwijzing naar een bestand wat niet bestaan. bestaatwel.mov is een bestand wat wel bestaat. qtdump wordt dus zowel via SSH als shell_exec uitgevoerd, echter wanneer ik een geldig movie bestand opgeef als parameter in shell_exec krijg ik geen output, en in SSH wel. En met SSH ook als ik het php script uitvoer. Het moviebestand heeft chmod 755 en chown hetzelfde als het php script.
Het verschil is natuurlijk dat ik met SSH als root ben ingelogd, en met het PHP script niet. Alle bestanden worden geowned door web110 (de user van het domein).
Wie kan me helpen? Ik ben er al een hele middag mee bezig.
Bij voorbaat dank!
Het is beter om met absolute paden aan de slag te gaan!
Dit is nu mijn code. De functie heb ik van http://www.php.net/manual/en/function.shell-exec.php#52826 Deze functie zou meerdere output streams afvangen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?php
$result= runExternal("/var/www/clients/client1/web110/web/media/tmextracter/qtdump /var/www/clients/client1/web110/web/media/2.mov",$code);
function runExternal($cmd,&$code) {
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("pipe", "w") // stderr is a file to write to
);
$pipes= array();
$process = proc_open($cmd, $descriptorspec, $pipes);
$output= "";
if (!is_resource($process)) return false;
#close child's input imidiately
fclose($pipes[0]);
stream_set_blocking($pipes[1],false);
stream_set_blocking($pipes[2],false);
$todo= array($pipes[1],$pipes[2]);
while( true ) {
$read= array();
if( !feof($pipes[1]) ) $read[]= $pipes[1];
if( !feof($pipes[2]) ) $read[]= $pipes[2];
if (!$read) break;
$ready= stream_select($read, $write=NULL, $ex= NULL, 2);
if ($ready === false) {
break; #should never happen - something died
}
foreach ($read as $r) {
$s= fread($r,1024);
$output.= $s;
}
}
fclose($pipes[1]);
fclose($pipes[2]);
$code= proc_close($process);
return $output;
}
?>
$result= runExternal("/var/www/clients/client1/web110/web/media/tmextracter/qtdump /var/www/clients/client1/web110/web/media/2.mov",$code);
function runExternal($cmd,&$code) {
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("pipe", "w") // stderr is a file to write to
);
$pipes= array();
$process = proc_open($cmd, $descriptorspec, $pipes);
$output= "";
if (!is_resource($process)) return false;
#close child's input imidiately
fclose($pipes[0]);
stream_set_blocking($pipes[1],false);
stream_set_blocking($pipes[2],false);
$todo= array($pipes[1],$pipes[2]);
while( true ) {
$read= array();
if( !feof($pipes[1]) ) $read[]= $pipes[1];
if( !feof($pipes[2]) ) $read[]= $pipes[2];
if (!$read) break;
$ready= stream_select($read, $write=NULL, $ex= NULL, 2);
if ($ready === false) {
break; #should never happen - something died
}
foreach ($read as $r) {
$s= fread($r,1024);
$output.= $s;
}
}
fclose($pipes[1]);
fclose($pipes[2]);
$code= proc_close($process);
return $output;
}
?>
Toevoeging op 25/10/2010 18:18:47:
Nu laat ik een bash script de qtdump uitvoeren. Via SSH werkt het, via de webbrowser krijg ik het volgende terug: "./dump.sh: line 2: 767 Segmentation fault /var/www/clients/client1/web110/web/media/tmextracter/qtdump /var/www/clients/client1/web110/web/media/2.mov code: 139"
Een segmentation fault hoe kan die ontstaan als het via een andere interface wordt uitgevoerd?
Gewijzigd op 25/10/2010 18:19:38 door Mike de Klerk
http://www.cyberciti.biz/tips/segmentation-fault-on-linux-unix.html
check dit for segmentation issues: Gewijzigd op 25/10/2010 19:18:35 door Aad B
Bedankt voor je reactie. Wellicht heeft het te maken met
Quote:
Het script behoort tenslotte tot een webuser, en ik via SSH ben root. qtdump zal wel dan misschien libraries aanspreken waar een webuser niet bij kan. Goede beveiliging wel een pain in the *ss als je geen workaround weet.Inside a chrooted jail this can occur when critical shared libs, config file or /dev/ entry missing.
Ik heb het probleem van de qtdump niet kunnen oplossen. Ik gebruik nu getid3() om een dump te maken van alle atoms in een quicktime bestand.
Bedankt voor de reacties.