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

时间:2018-09-01 20:38:52

标签: java command processbuilder chmod cd

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

“ java -jar some-jar-SNAPSHOT.jar”

问题是,每当我尝试访问任何类型的Shell脚本时,我都会得到error = 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 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

如果您的问题的标题正确,则表示Java程序是否能够读取和执行您正在谈论的 shell脚本

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

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


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

如果失败并显示“ permission否认”错误,则说明java命令不可执行,或者JAR文件不可读。

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


  
    

我的程序开始时只是尝试(通过CD)导航到包含JAR文件本身的目录:

  

我认为您意识到自己的尝试:

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

不起作用。它会更改子进程的当前目录,但对运行的父进程或 next 子进程没有影响。您应该使用ProcessBuilder,尤其是它的directory(File),它可以用来为子进程选择其他当前目录。

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