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


PHP exec function not executing my compiled program permissions related

我有一种感觉,这与权限有关,我用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>";
?>

在命令行上运行程序时,我得到的输出是"It works!"然而,当我在PHP上运行时,我没有得到任何输出(尽管我仍然得到[In:…''nOut:],我知道PHP正在工作)。

相关问题:php exec()没有执行命令

让我把"2>&1"放在最后,现在我得到的输出是:

输出:sh:1:/home/alex/Dropbox/code_snippets/output/a。输出:权限被拒绝

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

编辑:

  1. exec()函数确实有效,因为我使用了exec("whoami")来发现是用户www数据通过PHP执行它。

  2. 在目录上尝试了opendir()函数,它返回了相同的权限拒绝

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

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

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

将a.out复制到/var/www,PHP正在输出"它工作!"。

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

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

检查php.ini以查看safe_mode是否打开,或者在disable_functions中是否不允许执行()。

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

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

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

您可能需要使用umask:

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

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