为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕的地6264312 2021-08-25 16:25:33
我正在创建一个 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 设置文件的权限之后。我查看了大量不同的类似问题,但没有一个解决方案解决了我的问题。任何帮助是极大的赞赏。
查看完整描述

2 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

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

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

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

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


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

如果失败并出现“权限被拒绝”错误,则该java命令不可执行,或者 JAR 文件不可读。

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


我的程序首先尝试导航(通过 CD)到包含 JAR 文件本身的目录:

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

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

不起作用。它更改子进程的当前目录,但这对父进程或您运行的下一个子进程没有影响。您应该使用ProcessBuilderdirectory(File),特别是它可用于为子进程选择不同的当前目录。

这意味着您可能位于错误的目录中,这可能会导致“权限被拒绝”问题。


查看完整回答
反对 回复 2021-08-25
?
HUX布斯

TA贡献1876条经验 获得超6个赞

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

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

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


查看完整回答
反对 回复 2021-08-25
  • 2 回答
  • 0 关注
  • 551 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信