【问题标题】:Execute Java on Ubuntu: PHP exec() is not working while console works just fine在 Ubuntu 上执行 Java:PHP exec() 不工作,而控制台工作正常
【发布时间】: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


我试图缩小错误的原因,我的想法是这样的:

  1. exec() 本身就有问题:

    不太可能,因为whoami 按预期打印出 apache-user。

  2. 错误消息的含义:

    我搜索了这个错误。像this one 这样的帖子谈论它是由缺少类路径引起的。 我也不是这样,因为在控制台中它可以工作。所以错误消息没有任何意义(是吗?)

  3. 用户/组权限:

    是否可能不允许 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


【解决方案1】:

你试过java -cp /path/to/folder/containing/class/file Hello 2&gt;&amp;1吗?看来类文件本身不应该是类路径。它应该是 in 类路径。另一方面,如果这是一个 .jar 文件,那么您将在类路径中提供文件名。

【讨论】:

  • 嗨,Soumya!我的错。在真正的路径名中,它是目录,而不是类文件本身。我已经编辑了我的问题以反映这一点。很抱歉造成混乱!
【解决方案2】:

免费提供路径和 Hello.java 文件。

测试 apache 用户的权限:

sudo -u webmasters java -cp /path/to/java/class/file/folder Hello

chmod a+r Hello.class

【讨论】:

  • 嗨乔普!当我运行第一行时,它显示“sudo: echo.php: command not found”。另外,什么是“echo.php”?
  • 错误;应该是“java ...”
【解决方案3】:

我已经解决了这个问题......这很出乎意料。

我更改了类路径。

以前它类似于~/myproject/to/java/class/file/folder。 我把它改成了/home/myuser/myproject/to/java/class/file/folder

但我完全不明白为什么~ 表示法不适用于exec()

【讨论】:

  • ~ 指的是当前用户的主目录。因此,当在 apache 下运行脚本时,当前用户就是您的 apache-user。因此,当您使用 ~ 执行 php exec() 时,它很可能指向 /home/apache-user/。从您自己的答案来看,脚本所在的位置不是。
  • ~ 不起作用,因为它是当前用户主目录的 "placeholder"。 3 件事中有 1 件是错误的:apache 用户的主目录不是您想要的。 2:您在安全模式下运行,~ 正在被转义(不确定 PHP 是否转义波浪号,但可能)您依赖给定的 .profile 文件已加载,exec 也不执行(可能与此无关)
  • 好的,我明白了。谢谢大家!