猿问

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

我正在创建一个 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 设置文件的权限之后。


我查看了大量不同的类似问题,但没有一个解决方案解决了我的问题。任何帮助是极大的赞赏。


慕的地6264312
浏览 552回答 2
2回答

天涯尽头无女友

这与 JAR 文件的执行权限无关。实际上,JAR 文件只需要可读即可。如果您的问题的标题是准确的,这与 Java 程序是否能够读取和执行您正在谈论的shell 脚本有关:shell 脚本本身必须可由试图运行它们的有效用户执行。例如,脚本本身需要设置相关的执行位。shell 脚本的路径需要从根目录一直读取(由有效用户......)。(或当前目录,如果您使用的是相对于点的相对路径名。或者目录 $PATH ... 如果您使用的是简单的命令名称。)奇怪的是,这段代码根本不是试图运行 shell 脚本。那是一个简单的java命令。不涉及 shell 脚本。如果失败并出现“权限被拒绝”错误,则该java命令不可执行,或者 JAR 文件不可读。我认为您需要向我们提供更多信息;例如所有相关的输出、真实的代码和真实的文件/目录名称和权限。我的程序首先尝试导航(通过 CD)到包含 JAR 文件本身的目录:我假设您意识到您的尝试:    String[] cd = {jarDirectory.getAbsolutePath(), "cd"};     Runtime.getRuntime().exec(cd);不起作用。它更改子进程的当前目录,但这对父进程或您运行的下一个子进程没有影响。您应该使用ProcessBuilder它directory(File),特别是它可用于为子进程选择不同的当前目录。这意味着您可能位于错误的目录中,这可能会导致“权限被拒绝”问题。

HUX布斯

我不知道为什么这会导致权限被拒绝,但这应该是String[] jarCommand = {"java", "-jar", "some-jar-SNAPSHOT.jar"};否则,exec 调用将查找名为“java -jar some-jar-SNAPSHOT.jar”的可执行文件,尽管我希望这会导致 ENOENT 而不是 EPERM。
随时随地看视频慕课网APP

相关分类

Java
我要回答