PHP exec函数不执行我编译的程序相关权限

PHP exec函数不执行我编译的程序相关权限,php,linux,permissions,debian,exec,Php,Linux,Permissions,Debian,Exec,我有一种感觉,这是与权限有关的,我用g编译了下面的程序++ main.cpp #include <iostream> int main(int argc, char* argv[]) { std::cout << "It works!" << std::endl; return 0; } #包括 int main(int argc,char*argv[]) { 标准::cout 在命令行上运行程序时,我得到的输出是“It works!”,

我有一种感觉,这是与权限有关的,我用g编译了下面的程序++

main.cpp

#include <iostream>

int main(int argc, char* argv[])
{
    std::cout << "It works!" << std::endl;
    return 0;
}
#包括
int main(int argc,char*argv[])
{
标准::cout
在命令行上运行程序时,我得到的输出是“It works!”,但是当我在PHP上运行时,我没有得到任何输出(我仍然得到[In:…\nOut:],不过,我知道PHP正在工作)

相关问题:

让我把“2>&1”放在末尾,现在我得到一个输出:

Out:sh:1:/home/alex/Dropbox/code\u snippets/output/a.Out:权限被拒绝

在做了一个快速的sudo chmod 0777到a.out后,我仍然得到同样的结果。 还尝试了sudo chown www data a.out将所有权授予PHP,但也没有成功,我相信这很简单,但我发现很难找到解决方案。提前感谢

编辑:

  • exec()函数确实可以工作,因为我使用exec(“whoami”)来确定是用户www数据通过PHP执行它

  • 在目录上尝试了opendir()函数,但返回的权限被拒绝

  • 警告:opendir(/home/alex/Dropbox/code\u snippts/output):无法打开dir:Permission denied in/var/www/html/test.php

    我猜这是因为PHP仅限于执行/var/www中的内容。在互联网上多看一眼之后,我发现这可能会有所帮助:

    然后向下滚动到安装suPHP的部分,这似乎是一种设置在/var/www以外的目录中运行东西的能力的方法。还有其他人有更好的想法吗


    将a.out复制到/var/www,PHP将输出“It works!”。

    您的代码对我来说运行良好,因此这一定是环境配置问题

    1) exec()在php.ini中被列入黑名单

    检查php.ini以查看是否启用了安全模式,或者在
    禁用函数中是否不允许使用exec()

    2) Web服务器配置不允许包含文件的目录

    您没有说明是否正在使用Web服务器,但如果是这样的话,请确保服务器配置中有如下目录块(例如apache):

    
    选项索引跟随符号链接
    允许超越所有
    要求所有授权
    
    您可能需要使用umask:

    $umask = umask(0);
    $in  = "/home/alex/Dropbox/code_snippets/output/a.out";
    $out = exec($in);
    umask($oldumask);
    

    用户权限有问题:www数据无法读取/写入/执行/var/www目录以外的任何内容(默认情况下)。感谢emzy和Petr帮助我解决了这个问题。

    您是否检查了php.ini以确保允许使用exec()函数?特别检查它是否列在
    disable_functions
    中,你的PHP文件在哪里?你能从中打开directory/home/alex/Dropbox/code_snippets/output/吗?(以opendir()为例,函数)不,对不起,这不起作用,得到了相同的空白$out.exec肯定和我尝试的一样:
    exec(“whoami”)
    它返回了www-dataEmzy,您知道包含我需要更改的信息的apache配置文件的位置吗?默认情况下,它位于/etc/apache2/apache2.conf(基于Debian)中,但根据您的操作系统可能有所不同。这是我上面提到的第2个配置文件。很高兴您解决了这个问题。
    <Directory /var/www/>
      Options Indexes FollowSymLinks
      AllowOverride All
      Require all granted
    </Directory>
    
    $umask = umask(0);
    $in  = "/home/alex/Dropbox/code_snippets/output/a.out";
    $out = exec($in);
    umask($oldumask);