繁体   English   中英

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

[英]Running a C compiled program through a PHP webpage under linux

我的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;

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

可能导致这种类型问题的一件事是,如果Apache没有对output.txt本应到达的目录的写访问权。 执行ls -l ../来查看您是否实际上具有必要的权限。 我还将回显结果,因为这可能使您对正在发生的事情有更多的了解。

如评论中所述,问题是基于权限的。 此功能所需的最低权限如下

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

感谢您的所有贡献。

另一个可能的问题是,如果您启用了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命令通常只会更改内容,直到下次服务器重新启动为止。 当时,文件上下文是根据目录重新映射的,因此从长远来看,您将需要调整策略以将这些上下文设置为这些文件的默认上下文。 但是,我不记得该怎么做,所以您需要查一下。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM