【问题标题】:PHP exec function not executing my compiled program permissions relatedPHP exec函数不执行我编译的程序权限相关
【发布时间】:2014-10-29 10:10:35
【问题描述】:

感觉和权限有关,我用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() is not executing the command

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

输出:sh:1:/home/alex/Dropbox/code_sn-ps/output/a.out:权限被拒绝

在对 a.out 执行快速 sudo chmod 0777 后,我仍然得到同样的结果。 还尝试了 sudo chown www-data a.out 以将所有权授予 PHP,但这也不起作用,我确信这很简单,但我发现很难获得解决方案。提前致谢。

编辑:

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

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

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

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

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

将 a.out 复制到 /var/www 并且 PHP 正在输出“It works!”。

【问题讨论】:

  • 您检查过您的 php.ini 以确保您被允许使用 exec() 函数吗?具体检查它是否列在disable_functions
  • 您的 PHP 文件在哪里?您可以从中打开目录 /home/alex/Dropbox/code_sn-ps/output/ 吗? (以opendir(),函数为例)

标签: php linux permissions debian exec


【解决方案1】:

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

【讨论】:

  • 这是我上面所说的#2。很高兴您解决了问题。
【解决方案2】:

您可能需要使用 umask:

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

【讨论】:

  • 不,抱歉,这不起作用得到了相同的空白 $out。
【解决方案3】:

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

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>

【讨论】:

  • exec 确实像我尝试的那样工作:exec("whoami") 并且它返回了 www-data
  • Emzy,你知道apache配置文件在哪里,里面有我需要改的信息如上图吗?
  • 默认情况下,它位于 /etc/apache2/apache2.conf(基于 Debian)中,但可能因操作系统而异。
猜你喜欢
  • 2011-05-26
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多