2

我的 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 中键入相同的命令时,它都能完美运行(输入.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;

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

4

3 回答 3

1

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

于 2012-01-16T02:45:05.620 回答
0

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

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

于 2012-01-16T02:59:57.417 回答
0

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

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

感谢所有的贡献。

于 2015-05-20T09:22:54.677 回答