Запуск скомпилированной программы на C через веб-страницу PHP под Linux - PullRequest
2 голосов
/ 16 января 2012

В данный момент мой файл page.php выглядит следующим образом:

    <?php

    $cmd = './foo < input.txt > output.txt';

    $result = shell_exec($cmd);

    echo system('date'); //just to see change when refreshing the page

    ?>

Всякий раз, когда я набираю одну и ту же команду в оболочке, она отлично работает (с файлом input.txt, готовым с примером ввода).

Моя идея состояла в том, чтобы создать интерфейс, использующий php для связи с файлом input.txt, а затем связаться с файлом output.txt, чтобы вернуть результаты на странице.Но, прежде всего, мне нужно убедиться, что я могу запустить имеющуюся у меня программу.

Я скомпилировал с

    gcc -Wall -o foo foo.c

Исполняемый файл foo находится в том же каталоге, что и страница.php.

Я пытался с правами доступа 777 для всех файлов (page.php, input.txt и foo)

Сайт запущен и дата меняется при обновлениистраницы, но в каталоге нет файла output.txt.

Я пробовал

    $cmd = 'ls -la';

    $result = shell_exec($cmd);

    echo $result;

, и он работает должным образом, показывая содержимое соответствующего каталога.

Ответы [ 3 ]

1 голос
/ 16 января 2012

Единственное, что может вызвать проблемы такого типа, - это если у Apache нет доступа на запись в каталог , куда должен идти output.txt.Сделайте ls -l ../, чтобы увидеть, действительно ли у вас есть необходимые разрешения.Я также повторил бы результат, поскольку это могло бы дать вам больше представления о том, что происходит.

0 голосов
/ 20 мая 2015

Как указано в комментарии, проблема была основана на разрешении. Минимальные разрешения, необходимые для этой работы, следующие:

"711 для исполняемых файлов, 644 для входного файла, 666 для выходного файла и 755 для содержащей папки."

Спасибо за все вклады.

0 голосов
/ 16 января 2012

Другая возможная проблема заключается в том, что если вы включили SELinux (как это принято по умолчанию в Fedora и Red Hat), он заблокирует Apache от запуска команд, которые не были помечены как находящиеся в контексте Apache. Эта функция безопасности предназначена для того, чтобы, если кто-то взломал ваш веб-сервер или веб-приложение, он не мог использовать его для запуска произвольных команд на вашем сервере.

Чтобы установить правильный контекст для приложения, вы должны выполнить команду chcon -t httpd_sys_script_exec_t execname (где execname заменяется именем вашего исполняемого файла). Вам также необходимо изменить контекст входных и выходных файлов, чтобы они могли быть записаны скриптами apache через chcon. Вы должны будете использовать тип httpd_sys_script_ro_t для входных файлов только для чтения и набрать httpd_sys_script_rw_t для выходных файлов для чтения / записи или введите httpd_sys_script_ra_t для выходных файлов для чтения / добавления. Впрочем, команда chcon обычно только меняет вещи до следующей перезагрузки сервера. Файловые контексты переназначаются на основе каталогов в то время, поэтому в долгосрочной перспективе вы захотите изменить свою политику, чтобы установить эти контексты как контексты по умолчанию для этих файлов. Однако я не помню, как это сделать, так что вам нужно будет это найти.

...