我觉得它与权限有关,我使用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所有权,但这也没有用,我确定它很简单,但我发现很难得到解决方案。提前谢谢。
编辑:
exec()函数肯定有效,因为我使用了exec(&#34; whoami&#34;)来发现它是通过PHP执行它的用户www-data。
< / LI>在目录上尝试了opendir()函数并返回了相同的权限被拒绝
警告: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;。
答案 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帮我解决了这个问题。