0

为什么我不能在 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 也没有处于安全模式,并且没有禁用任何功能。

4

3 回答 3

1

从 PHP 执行可在 shell 中正常工作的外部命令时的一些常见故障:

  • 命令使用相对路径,但 PHP 是从任意位置启动的:

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

  • PHP 和 shell 运行不同的命令。许多人称之为类似的东西exec("foo $bar"),甚至不检查"foo $bar"包含的内容。

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

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

    • 寻找 SELinux 或类似工具。
于 2013-09-03T11:37:32.177 回答
0

只是猜测,但您尝试执行的二进制文件可能没有适当的权限。在命令行中预先设置它会./强制它执行,但 PHP 可能出于安全目的将其剥离。尝试这个:

chmod +x c-compiled-file
于 2013-09-03T11:18:57.553 回答
0

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

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

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

为了更好的衡量:

exec只是执行一个外部程序。

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

最后,您应该始终使用绝对路径在 cron 或 php 或其他任何内容中执行此类操作......所以不要使用./c-compiled-file argv1 argv2 argv3,而是使用/home/username/c-compiled-file argv1 argv2 argv3或任何完整路径。

于 2013-09-03T11:16:20.410 回答