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

时间:2014-09-04 15:19:24

标签: php linux permissions debian exec

我觉得它与权限有关,我使用g ++编译了以下程序

的main.cpp

#include <iostream>

int main(int argc, char* argv[])
{
    std::cout << "It works!" << std::endl;
    return 0;
}

我有PHP文件

test.php的

<?php
// DEBUG /////////////////////////////////
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
//////////////////////////////////////////

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

echo "In : " . $in  . "<br>";
echo "Out: " . $out . "<br>";
?>

在命令行上运行程序我得到输出&#34;它有效!&#34;然而,当我运行PHP时,我没有得到任何输出(我仍然得到[In:... \ nOut:]但是,我知道PHP正在运行。)

相关问题:php exec() is not executing the command

让我把&#34; 2 - ;&安培; 1&#34;最后,现在我得到了一个输出:

  

Out:sh:1:/home/alex/Dropbox/code_snippets/output/a.out:权限被拒绝

在a.out做了一个快速的sudo chmod 0777后,我仍然得到同样的东西。 还尝试了sudo chown www-data a.out来赋予PHP所有权,但这也没有用,我确定它很简单,但我发现很难得到解决方案。提前谢谢。

编辑:

  1. exec()函数肯定有效,因为我使用了exec(&#34; whoami&#34;)来发现它是通过PHP执行它的用户www-data。

    < / LI>
  2. 在目录上尝试了opendir()函数并返回了相同的权限被拒绝

  3.   

    警告:opendir(/ home / alex / Dropbox / code_snippts / output):无法打开dir:/var/www/html/test.php中的权限被拒绝

    我猜测这是因为PHP只限于在/ var / www中执行一些东西后再多看一下我发现这可能会有所帮助:

    https://help.ubuntu.com/community/ApacheMySQLPHP并向下滚动到安装suPHP的部分,这似乎是一种设置在/ var / www以外的目录中运行东西的能力的方式,还有其他人有更好的想法吗?

    将a.out复制到/ var / www并且PHP输出&#34;它有效!&#34;。

3 个答案:

答案 0 :(得分:0)

您的代码对我来说很好,所以它必须是一个环境配置问题。

1)exec()被列入php.ini

列入黑名单

检查php.ini以查看safe_mode是否已启用,或者disable_functions中是否禁止执行exec()。

2)网络服务器配置不允许包含您的文件的目录。

您还没有说过,如果您正在使用网络服务器,但请确保您的服务器配置中有如下所示的目录块(如果是这样的话)(例如apache) :

<Directory /var/www/>
  Options Indexes FollowSymLinks
  AllowOverride All
  Require all granted
</Directory>

答案 1 :(得分:0)

您可能需要使用umask:

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

答案 2 :(得分:0)

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