Java中chmod命令出现"Permission denied"错误

12

我有一个可执行文件(ffmpeg),我正在尝试在Mac上用Java程序运行它。 我使用Java程序发送命令chmod 777 /path/to/ffmpeg,但是当我尝试运行ffmpeg时,我会收到以下错误:

java.io.IOException: Cannot run program "/Users/james/WalkTheHall/ffmpeg": error=13, Permission denied

但当我在打开Java应用程序之前,从终端上自己运行 chmod 777 /path/to/ffmpeg 命令后,在Java程序中对ffmpeg的命令就可以正常运行。

在Java程序内调用 chmod 和自己手动调用有区别吗?为什么它不起作用?谢谢!


也许您正在使用没有足够权限对该文件进行chmod操作的用户运行Java可执行文件。 - Silvio Donnini
细节...我不知道在Mac上,但在GNU/Linux上作为普通用户,您无法执行chmod 777(某些权限被“掩盖”),因此当您尝试从终端运行时,您确实是可以执行此操作的用户类型,而您将Java作为无法执行此操作的用户运行?(Java虚拟机在以“管理员”身份运行时可能会放弃特权,以增强安全性) - ShinTakezou
6个回答

7

我在我的代码中也遇到了同样的问题。我通过在exec后添加waitFor解决了这个问题。当下一个命令被执行时,"chmod"进程可能还没有完成。代码可能如下所示:

p = Runtime.getRuntime.exec("chmod 777 xxx");
p.waitFor();
Runtime.getRuntime.exec("./xxx");

4

是的,有所不同。当您从终端运行命令时,执行操作的是您本人,因此使用的是您的凭据执行操作。而Java应用程序则使用Java应用程序的权限来运行命令。这是为了防止应用程序运行后对文件系统进行危险、不需要的更改。也许其他人可以详细说明并提供解决方法。


谢谢Ryan!肯定有一种方法可以在Java中运行程序。你有什么想法吗? - James Skidmore
不确定。这似乎在设计上是不允许的,就像ShinTakezou在您的问题中所说的那样,出于安全原因。您尝试过CarlG的答案吗?如果它在Linux上有效,那么在Mac OS上肯定值得一试。 - Ryan Hayes

4

非常感谢你,Carl。使用bash运行它完美无缺! - James Skidmore
which chmod 对我来说是 /bin/chmod,因此在 bash-3.2.48 下它是一个可执行文件而不是 shell 内置命令。也许启动 Java 的任何内容都没有将其添加到可执行文件搜索路径中,但调用 shell 运行用户 shell 配置脚本会修复 PATH。 - Mike Samuel

2

试试这个:

File commandFile = new File("myFile.txt");
commandFile.setExecutable(true);
Process p = Runtime.getRuntime.exec(commandFile.getAbsoluteFile());

@RamandeepSingh 这是来自 File 类的,我修改了答案以使其更清晰。谢谢。 - Jefferson Lima
你能告诉我如何通过Android Studio运行shell命令吗?例如,当我点击一个按钮时,我想执行“adb shell”。 - Ramandeep Singh

2
我目前正在开发一个项目,该项目还在OSX上使用FFMpeg。我将FFMpeg存储在JAR中,并在使用时提取它并设置为可执行文件,就像你似乎正在做的那样。这是我的做法,它似乎有效。
public static void setExecutable(File file, boolean executable)
{
    Process p = Runtime.getRuntime().exec(new String[] {
        "chmod",
        "u"+(executable?'+':'-')+"x",
        file.getAbsolutePath(),
    });
    // 做一些确保p完成和捕获输出的操作
}
代码使用GPL许可证,所以请随意查看。它不是最好的代码库,甚至FFMpeg的东西可能过于复杂,但它能正常工作。
源代码可以在http://korsakow.net中查看。
这两个文件可能对你有用: FFMpegEncoderOSX.java FileUtil.java

感谢您的答复,我很感激!我正在运行该命令,但仍然出现权限被拒绝的错误。有任何想法为什么会这样吗? - James Skidmore

0

在OSX上启动程序,您需要这样做:

Runtime.getRuntime().exec("chmod 777 "+path);   //in order to execute it
Runtime.getRuntime().exec(path);                //execute it
Runtime.getRuntime().exec("chmod 744 "+path);   //undo every change

路径应该是程序的执行文件路径,例如:

AppStore -> Applications/App\ Store.app/Contents/MacOS/App\ Store


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接