为什么shell_exec不执行文件但执行简单命令?

时间:2013-09-03 11:11:25

标签: php

我有什么理由不能在PHP的shell_exec / exec / system函数中编译文件吗?

在命令行和PHP的shell_exec函数中工作的示例:

<?php
$data = shell_exec("ls");
echo $data;
?>

在PHP的shell_exec函数中不起作用但在命令行中可以工作的示例(我可以确认):

<?php
$data = shell_exec("./c-compiled-file argv1 argv2 argv3");
echo $data;
?>

我的服务器上有什么可以做的,这样可以吗?我到处寻找,没有找到解决问题的解决方案。编译后的文件也与PHP脚本位于同一目录中,它不会执行它。此外,如果你问,是的,我已经尝试过SSH2,但它仍然无法执行。

此外,PHP未处于安全模式且禁用了NO功能。

3 个答案:

答案 0 :(得分:1)

从PHP执行外部命令时出现的一些常见故障:shell:

  • Command使用相对路径,但PHP从任意位置启动:

  • PHP和shell使用不同的用户凭据运行。当PHP通过Web服务器运行时,通常就是这种情况。

  • PHP和shell运行不同的命令。很多人会调用exec("foo $bar")之类的内容,甚至不会检查"foo $bar"包含的内容。

  • 未进行错误检查。最低限度是捕获和打印标准输出,标准错误,状​​态代码,当然还有所有PHP错误消息,包括警告和通知。

  • 不允许Web服务器在操作系统级别执行该命令。

    • 了解SELinux或类似工具。

答案 1 :(得分:0)

您希望在第二种情况下使用system,而不是shell_exec

system执行外部程序并显示输出。

shell_exec通过shell执行命令并将完整输出作为字符串返回。

并且措施良好:

exec只执行外部程序。

此外,您希望确保您的外部程序是可执行的(尽管您已经说过,我将重申这一点)对运行Web服务器的用户具有执行权限。您还需要确保运行外部程序的目录能够写入其目录或/ tmp或您设置的任何输出目录。

最后你应该总是使用绝对路径在cron或php或其他任何地方执行这样的事情......所以不要使用./c-compiled-file argv1 argv2 argv3,而是使用/home/username/c-compiled-file argv1 argv2 argv3或完整路径。

答案 2 :(得分:0)

只是猜测,但您尝试执行的二进制文件可能没有适当的权限。在命令行中使用./进行预处理会强制它执行,但为了安全起见,PHP可能会删除它。试试这个:

chmod +x c-compiled-file