2012-05-06 3 views
0

Мой друг использует приложение через терминал в Ubuntu. Я не уверен в его имени, в какой-то математической программе. Он открывает терминал, набирает команду для запуска программы, а затем приглашение терминала переходит к приглашению для своей программы, и он может вводить команды, и это даст ему выход.Взаимодействие с терминальной программой от php?

В любом случае, он говорил, что хотел бы иметь интерфейс к этому приложению на веб-странице, но он мало знает о веб-разработке. Таким образом, я вижу, что кто-то пойдет на сайт (на PHP), введите некоторые команды в форму и нажмите «Отправить» ... тогда сервер запустит эту терминальную программу (еще лучше, если она уже запущена) send команды к нему, получить любой вывод, который он дает, и отправить его обратно в браузер пользователя.

Так что мне интересно, можно ли это сделать с PHP? Могу ли я взаимодействовать с какой-либо программой, запущенной в терминале через PHP?

+1

Посмотрите на ['exec'] (http://php.net/manual/en/function.exec.php). – bfavaretto

+1

Это можно сделать. Сделать это безопасно - другое дело. Все, что связано с вводом пользователя и передачей его во внешнюю программу exec() 'd, является очень опасным, если вы не знаете, что делаете. –

+1

@csss посмотрите на это http://php.net/manual/es/function.shell-exec.php, но, как говорит Марк, нужно быть осторожным. – ant

ответ

3

Возможно, программа запущена в интерактивном режиме, когда вы запускаете ее в командной строке. Попробуйте запустить command -h (command - имя программы), чтобы увидеть, есть ли неинтерактивный режим, который просто принимает строку ввода и выводит одну строчку в ответ.

Если да, то вы можете получить вход с помощью простой формы POST, а затем использовать:

echo shell_exec("command -options ".escapeshellarg($_POST['input'])); 

Где command снова название программы, -options любые варианты, которые вы должны сделать его запустить в неинтерактивный mode и $_POST['input'] - это переменная формы.


В качестве альтернативы, если программа не поддерживает не-интерактивный режим, вам нужно будет использовать proc_open и связанные с ними функции. Что-то в этих строках:

if($process = proc_open(
    "command", 
    Array(
     Array("pipe","r"), 
     Array("pipe","w"), 
     Array("file","errors.log") 
    ), 
    $pipes 
)) { 
    fwrite($pipes[0],$_POST['input']); 
    fclose($pipes[0]); 
    echo stream_get_contents($pipes[1]); 
    fclose($pipes[1]); 
    proc_close($process); 
} 
Смежные вопросы