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

在linux下通过PHP网页运行C编译程序,php,c,shell-exec,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 ?> foo可执行文件与page.php位于同一目录中 我尝试了对所有文件(page.php、inp

目前,我的page.php文件如下所示:

    <?php

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

    $result = shell_exec($cmd);

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

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

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

当我刷新页面时,站点已启动并运行,日期也会更改,但目录中没有output.txt

我试过了

    $cmd = 'ls -la';

    $result = shell_exec($cmd);

    echo $result;

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

可能导致此类问题的一个原因是Apache没有对output.txt应该去的目录的写访问权限。执行
ls-l../
以查看您是否实际拥有所需的权限。我还想呼应一下结果,因为这可能会让您对正在发生的事情有更多的了解。

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


要为应用程序设置正确的上下文,您需要运行命令
chcon-t httpd_sys_script_exec_t execname
(其中execname替换为可执行文件的名称)。您还需要更改输入和输出文件的上下文,以允许apache脚本通过chcon编写这些文件。对于只读输入文件,您需要使用type
httpd\u sys\u script\u ro\u t
,对于读/写输出文件,您需要使用type
httpd\u sys\u script\u rw\t
,对于读/附加输出文件,您需要使用type
httpd\u sys\u script\u ra\u t
。不过,chcon命令通常只会在下次服务器重新启动之前进行更改。文件上下文将根据当时的目录重新映射,因此从长远来看,您需要调整策略,将这些上下文设置为这些文件的默认上下文。但是,我不记得该怎么做了,所以你需要查一下。

如一篇评论中所述,这个问题是基于权限的。此操作所需的最低权限如下

711在可执行文件上,644在输入文件上,666在输出文件上,755在包含文件夹上


感谢您的所有贡献。

您也尝试过使用777权限访问该目录吗?使用:getcwd()检查路径,看看“input.txt”是否位于预期目录中。(另外,如果可能的话,您应该寻找通过
shell\u exec
运行程序、编写文件等的替代方法)@lepe
getcwd()
如果给出
ls-al
输出,应该可以。@mvds:你说得对。那么很可能就是您所指出的目录权限。
    $cmd = 'ls -la';

    $result = shell_exec($cmd);

    echo $result;