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" 问题。
我正在创建一个 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" 问题。