尝试以 root 用户身份(未安装 JDK)从 Java 应用程序启动新进程时权限被拒绝

尝试以 root 用户身份(未安装 JDK)从 Java 应用程序启动新进程时权限被拒绝

我尝试使用 Java 启动一个新进程ProcessBuilder,运行如下用户(在原型设计阶段)。
当我使用随安装的 JDK 运行应用程序时,它可以按预期工作apt

我的要求是允许使用按需下载的自定义 JDK。我认为解压 JDK tar.gz 文件并将bin文件夹中的命令标记为可执行文件就足以使这个“解压的”JDK 可用:

-rwxr-xr-x 1 root 12328 Aug  3 22:33 java

但是由于某种原因,当我使用这个“解压后的” JDKjava命令启动同一个应用程序时:

#!/usr/bin/env sh

export APP_HOME = "/opt/path/to/app"
export JAVA_HOME = "/opt/path/to/simply/unpacked/jdk"
$JAVA_HOME/bin/java -jar $APP_HOME/app.jar

当我尝试使用 启动新进程时ProcessBuilder,无论我尝试执行什么,都会出现以下错误(即使非常简单的命令也会失败,例如whoami):

Caused by: java.io.IOException: Cannot run program "/usr/bin/whoami" (in directory "/opt/..."): error=13, Permission denied
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1140)
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1074)
    at org.zeroturnaround.exec.ProcessExecutor.invokeStart(ProcessExecutor.java:997)
    ... 11 common frames omitted
Caused by: java.io.IOException: error=13, Permission denied
    at java.base/java.lang.ProcessImpl.forkAndExec(Native Method)
    at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:319)
    at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:249)
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1111)
    ... 13 common frames omitted

我已经尝试了两种不同的 JDK(科雷托神谕) 结果相同……

Kotlin 代码很简单,例如:

    try {
        ProcessBuilder().command("/usr/bin/whoami").inheritIO().start().waitFor()
    } catch (e: Exception) {
        println("whoami failed")
    }

我使用 Ubuntu Server 22.04.2 LTS。

该系统是Ubuntu Server的简单默认安装,一个分区,没有网络驱动器等,
/opt也在本地磁盘上:

$df -Th /opt/myapp/runtime

Filesystem                        Type  Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv ext4   98G   23G   71G  25% /

输出ls -l /usr/bin/whoami

$ ls -l /usr/bin/whoami
-rwxr-xr-x 1 root root 31232 Feb  7  2022 /usr/bin/whoami

附言:我是一名 Kotlin/Java 开发人员和普通 Linux 用户,Ubuntu 是我首选的开发操作系统 - 但我不是 Linux 高级用户 :)

答案1

我遇到了类似的问题,解决方案是chmod +x lib/jspawnhelper在 JRE 文件夹中。

相关内容