[英]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.