【发布时间】:2025-11-25 15:40:01
【问题描述】:
我的网站需要 PHP 在后台运行 Java 程序。因此,PHP 发出exec() 方法让Java 完成所有工作。该实现在 Windows 上运行良好,但在 Ubuntu 上完全失败。虽然exec() 不起作用,但使用控制台进行独立测试就可以了。
我设置了test.php 来缩小问题范围:
<?php
$output = exec("java -cp ~/path/to/java/class/file/folder Hello 2>&1");
//$output = exec("whoami");
echo $output;
?>
Hello.java 很简单:
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
通过在本地主机上运行test.php,它显示:
Error: Could not find or load main class Hello
我试图缩小错误的原因,我的想法是这样的:
-
exec()本身就有问题:
不太可能,因为whoami按预期打印出 apache-user。
- 错误消息的含义:
我搜索了这个错误。像this one 这样的帖子谈论它是由缺少类路径引起的。 我也不是这样,因为在控制台中它可以工作。所以错误消息没有任何意义(是吗?)
- 用户/组权限:
是否可能不允许 apache-user 运行类文件?
我查了一下,发现Hello.class的权限码是rw-r--r--,属于apache-user:webmasters。
但是,即使没有人拥有该文件的x权限,在控制台中我仍然可以运行它(使用我自己的用户)。
我不确定这里的情况。但是我的理解是,通过运行java程序,真的是JVM在执行它(或者别的什么);所以Hello.class的许可并不重要。
我发现另一个post也有类似的情况。但它的解决方案 - 指定 Java bin/usr/bin/java的完整路径 - 对我不起作用......
是什么导致了错误?
有人可以帮忙吗?感谢详细的解决方案!我是新手@_@
非常感谢!!!
【问题讨论】:
-
apache-user 是否可以访问 path/to/java 文件?
-
是的,apache-user 是文件和子目录的所有者,并且在项目基目录的组中,至少具有
r访问权限。 -
等待...`ls /path/to/java/class/foldr 2>&1' 访问被拒绝。让我再试一次……我的错!
标签: java php ubuntu permissions exec