通过linux下的PHP网页运行C编译的程序

时间:2012-01-16 02:39:26

标签: php c shell-exec

我的page.php文件目前看起来像这样:

    <?php

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

    $result = shell_exec($cmd);

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

    ?>

每当我在shell中输入相同的命令时,它都能正常工作(输入示例文件就准备好了input.txt文件)。

我的想法是创建一个使用php与input.txt文件通信的接口,然后与output.txt文件通信以返回页面上的结果。 但是,首先,我需要确保我可以运行我的程序。

我用

编译
    gcc -Wall -o foo foo.c

foo可执行文件与page.php位于同一目录。

我尝试了对所有文件(page.php,input.txt和foo)的777权限

网站启动并运行,刷新页面时日期发生了变化,但目录中没有output.txt。

我试过

    $cmd = 'ls -la';

    $result = shell_exec($cmd);

    echo $result;

它按预期工作,显示正确目录的内容。

3 个答案:

答案 0 :(得分:1)

可能导致此类问题的一件事是,如果Apache没有对目录的写访问权,那么output.txt应该去。执行ls -l ../以查看您是否确实拥有必要的权限。我也会回应结果,因为这可能会让你更多地了解正在发生的事情。

答案 1 :(得分:0)

另一个可能的问题是,如果你启用了SELinux(这是Fedora和Red Hat中的默认设置),它将阻止Apache运行未被标记为在Apache上下文中的命令。这是一个安全功能,旨在使得如果某人攻击您的Web服务器或Web应用程序,他们就无法使用它在您的服务器上运行任意命令。

要为应用程序设置正确的上下文,您需要运行命令chcon -t httpd_sys_script_exec_t execname(其中execname将替换为您的可执行文件的名称)。您还需要更改输入和输出文件的上下文,以允许它们通过chcon由apache脚本编写。您需要将类型httpd_sys_script_ro_t用于只读输入文件,并为读/写输出文件键入httpd_sys_script_rw_t或为读/写输出文件键入httpd_sys_script_ra_t。但是,chcon命令通常只会在下次服务器重新启动之前进行更改。文件上下文是根据当时的目录重新映射的,因此从长远来看,您需要调整策略以将这些上下文设置为这些文件的默认上下文。但是,我不记得如何做到这一点,所以你需要查看它。

答案 2 :(得分:0)

正如评论中所述,问题是基于许可。此工作所需的最低权限如下

“可执行文件为711,输入文件为644,输出文件为666,包含文件夹为755。”

感谢所有的贡献。