【问题标题】:Permission denied error in Java for chmod commandchmod 命令在 Java 中的权限被拒绝错误
【发布时间】:2011-03-06 09:08:03
【问题描述】:

我有一个可执行文件 (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 时,ffmpeg 的命令将在 Java 程序中正常运行。

从 Java 程序中调用 chmod 和我自己调用它有区别吗?为什么它不起作用?谢谢!

【问题讨论】:

  • 也许你正在运行 java 可执行文件的用户没有 chmod 文件的权限
  • 详细信息...我不知道在 Mac 上,但在 GNU/Linux 上作为普通用户你不能这样做chmod 777(某些权限被“屏蔽”),所以当你从终端尝试你确实是那种可以做这样的事情的用户,而你作为一个不能做的用户运行java? (java vm 也有可能在以“超级”用户身份运行时放弃特权,只是为了增强安全性)

标签: java permissions


【解决方案1】:

我的代码中出现了同样的问题。 我通过在 exec 之后添加 waitFor 解决了这个问题。执行下一个命令时,“chmod”过程尚未完成。代码可能如下所示:

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

【讨论】:

    【解决方案2】:

    我猜chmod 是一个shell 命令,而不是一个可执行文件。尝试通过您的 shell 运行 chmod。在此处查看更多详细信息:Want to invoke a linux shell command from Java

    【讨论】:

    • 非常感谢 Carl,用 bash 运行它非常完美!
    • which chmod 对我来说是/bin/chmod 所以在 bash-3.2.48 下它是一个可执行文件而不是内置的 shell。也许无论什么启动 Java 都没有它在可执行搜索路径上,但是调用 shell 会运行用户 shell 配置脚本来修复 PATH。
    【解决方案3】:

    是的,有区别。当您从终端运行命令时,是您执行该操作,因此它是使用您的凭据执行的。 Java 应用程序正在使用 Java 应用程序的权限运行命令。这是为了防止应用程序运行然后对文件系统进行危险的、不需要的更改。也许其他人可以详细说明并指导解决此问题。

    【讨论】:

    • 谢谢瑞恩!当然有一种方法可以在 Java 中运行程序。有什么想法吗?
    • 不确定。出于安全原因,这似乎是设计上不允许的,就像 ShinTakezou 对您的问题的评论所说的那样。您是否尝试过 CarlG 的答案?如果它可以在 Linux 上运行,那么在 Mac OS 上绝对值得一试。
    【解决方案4】:

    我目前正在开发一个在 OSX 上也使用 FFMpeg 的项目。我将 FFMpeg 存储在 JAR 中并提取它并设置可执行文件,就像您正在做的那样。这就是我所做的,它似乎有效。

    public static void setExecutable(文件文件,布尔可执行文件) { 进程 p = Runtime.getRuntime().exec(new String[] { "chmod", "u"+(可执行文件?'+':'-')+"x", 文件.getAbsolutePath(), }); // 做一些事情来确保 p 完成并捕获输出 }

    代码是 GPL,所以请随时查看。它不是最好的代码库,甚至 FFMpeg 的东西也可能过于复杂,但它确实有效。

    来源可在http://korsakow.net查看

    这两个文件可能会让你特别感兴趣

    FFMpegEncoderOSX.java

    FileUtil.java

    【讨论】:

    • 感谢您的回答,非常感谢!我正在运行该命令,但它仍然给出权限被拒绝错误。任何想法为什么?
    【解决方案5】:

    试试这个:

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

    【讨论】:

    • @RamandeepSingh 它来自 File 类,我编辑了答案以使其更清晰。谢谢。
    • 你能告诉我通过 android studio 运行 shell 命令的方式吗?例如单击一个按钮,我想执行“adb shell”。
    【解决方案6】:

    要在 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
    

    path应该是程序exc的路径,例如:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-18
      • 2012-11-24
      • 1970-01-01
      • 2023-01-26
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      相关资源
      最近更新 更多