Java - 尝试执行 shell 脚本时权限被拒绝

Java - Permission Denied when attempting to execute shell script

我正在创建一个 Java 程序,它将执行一个 JAR 文件以在我的机器上本地部署一个数据库。为此,我需要从 shell 脚本执行 JAR 文件(这需要自动部署,而不是手动部署)。

"java -jar some-jar-SNAPSHOT.jar"

问题是,每当我尝试访问任何类型的 shell 脚本时,我都会收到错误=13,权限被拒绝。我已经使用 sudo chmod 777 为所有用户以及 JAR 文件本身读取、写入和执行我的目录。即使我尝试更改目录也会出现此问题。

这是我用来执行命令的代码片段:

String[] jarCommand = {"java -jar some-jar-SNAPSHOT.jar"}; Process process = Runtime.getRuntime().exec(jarCommand); System.out.println("Jar File accessed");

编辑:当我尝试执行一个简单的命令时会出现此权限问题,例如:

String[] cd = {jarDirectory.getAbsolutePath(), "cd"}; Runtime.getRuntime().exec(cd);

这是在通过chmod 设置文件的权限之后。

我研究了很多不同的、相似的问题,none 的解决方案解决了我的问题。非常感谢任何帮助。

我不知道为什么这会导致权限被拒绝,但应该是

String[] jarCommand = {"java", "-jar", "some-jar-SNAPSHOT.jar"};

否则 exec 调用将查找名为 "java -jar some-jar-SNAPSHOT.jar" 的可执行文件,尽管我希望这会导致 ENOENT 而不是 EPERM。

这与 JAR 文件的执行权限无关。其实JAR文件只需要可读即可。

如果你的问题的标题是准确的,这是关于 Java 程序是否能够读取和执行你正在谈论的 shell 脚本 :

  • shell 脚本本身必须可由尝试 运行 它们的有效用户执行。例如,脚本本身需要设置相关的执行位。

  • shell 脚本的路径需要从根目录一直可读(有效用户...)。 (或者当前目录,如果您使用的是 dot-relative 相对路径名。或者目录 $PATH ... 如果您使用的是简单的命令名称。)


奇怪的是,代码片段根本不是 运行 shell 脚本的尝试。这是一个简单的 java 命令。不涉及 shell 脚本。

如果失败并出现 "permission denied" 错误,则 java 命令不可执行,或者 JAR 文件不可读。

我认为您需要向我们提供更多信息;例如所有相关输出、真实代码和真实文​​件/目录名称和权限。


My program starts by simply attempting to navigate (via CD) to the directory that contains the JAR file itself:

我假设您意识到您的尝试:

    String[] cd = {jarDirectory.getAbsolutePath(), "cd"};
    Runtime.getRuntime().exec(cd);

不起作用。它更改 child 进程的当前目录,但这对 parent 或 next child 进程没有影响 运行。您应该使用 ProcessBuilder,特别是它的 directory(File),可用于为 child 进程选择不同的当前目录。

这意味着您可能在错误的目录中,这可能会导致 "permission denied" 问题。