我有什么理由不能在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功能。
答案 0 :(得分:1)
从PHP执行外部命令时出现的一些常见故障:shell:
Command使用相对路径,但PHP从任意位置启动:
PHP和shell使用不同的用户凭据运行。当PHP通过Web服务器运行时,通常就是这种情况。
PHP和shell运行不同的命令。很多人会调用exec("foo $bar")
之类的内容,甚至不会检查"foo $bar"
包含的内容。
未进行错误检查。最低限度是捕获和打印标准输出,标准错误,状态代码,当然还有所有PHP错误消息,包括警告和通知。
不允许Web服务器在操作系统级别执行该命令。
答案 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