Я пытаюсь запустить Джона Потрошителя из сценария PHP.Я хочу запустить его, а затем контролировать его вывод, реагируя соответственно.Тем не менее, все работает не так, как ожидалось, и результаты, которые я получаю, являются (на мой взгляд) случайными.Я могу представить, что мне чего-то не хватает.
Проблема в том, что выходной поток не производит никакого вывода.Это несколько нормально для Джона - вывод производится, когда пользователь вводит символ с клавиатуры.Итак, я пишу в канал stdin, который я настроил.Однако это не приводит к тому, что Джон производит продукцию.Есть предложения?
Код:
<?php
$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("file", "/tmp/error-output.txt", "w") // stderr is a file to write to
);
// JOHN is the full path to the john executable
$command = JOHN . " --nolog --config=" . dirname (JOHN) . "/john.conf working/hashes-job-{$_POST['id']} --pot=working/hashes-job-{$_POST['id']}.pot";// --format=raw-md5";
$process = proc_open ($command, $descriptorspec, $pipes);
if (is_resource ($process)) {
sleep(5);
fwrite ($pipes[0], "a\n");
fflush ($pipes[0]);
while (!feof ($pipes[1])) {
// I have tried with the following uncommented as well
// That led to the while loop exiting prematurely for some reason...
// stream_set_blocking($pipes[1], false);
$output = fread ($pipes[1], 4096);
// stream_set_blocking($pipes[1], true);
file_put_contents ('/tmp/dpcp-tool-' . time (), $output);
fwrite ($pipes[0], 'a');
fflush ($pipes[0]);
file_put_contents ('/tmp/publishOutcome-' . time (), $reply);
sleep(5);
}
file_put_contents('/tmp/died-' . time(), $entered);
fclose ($pipes[0]);
fclose ($pipes[1]);
$return_value = proc_close ($process);
}