java.io.IOException: error=13, Permission denied while execution an .exe library

Posted

技术标签:

【中文标题】java.io.IOException: error=13, Permission denied while execution an .exe library【英文标题】:java.io.IOException: error=13, Permission denied while executing an .exe library 【发布时间】:2022-01-21 12:56:50 【问题描述】:

我的 Java 程序在托管服务器(不是我的)下运行,该程序使用 ffmpeg 作为视频处理库,在我的本地主机安装上,我在使用我的程序和执行 ffmpeg 时没有遇到任何问题,程序提取了 ffmpeg。 exe 某处并运行它,但是当它在另一台服务器上使用时,我在执行 ffmpeg 时出现以下错误:

  java.io.IOException: Cannot run program "softwares/player/libraries/ffmpeg.exe": error=13, Permission denied
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1143)
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1073)
    at com.albert4224.player.Loader.run(TaskAsyncLoadVideo.java:83)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:833)
  Caused by: java.io.IOException: error=13, Permission denied
    at java.base/java.lang.ProcessImpl.forkAndExec(Native Method)
    at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:314)
    at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:244)
    at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1110)

我尝试通过 ffmpegFile.setExecutable(true)、File.setReadable(true)、File.setWritable(true) 等 Java 代码更改 ffmpeg.exe 文件的权限,但未成功,还尝试通过我的 FileZilla 软件到 777,但再次失败:

奇怪的是服务器重启后权限恢复到750,但即使在重启之前它也不起作用。

可能与:Permission denied error in Java for chmod command有关,我尝试运行其他使用 .exe 库的程序并导致java.io.IOException: Cannot run program "/bin/chmod": error=13, Permission denied

这是我的代码:

            String[] videoCommand = new File(softhware.getFolder() + "/libraries/", "ffmpeg.exe").getAbsoluteFile().getAbsolutePath(), "-hide_banner", "-loglevel", "error", "-i", video.getVideoFile().getAbsolutePath(), "-q:v", "0",
                    "-start_number", String.valueOf(framesCount), new File(video.getFramesFolder().getPath(), "%d.jpg").getAbsolutePath();
            
            ProcessBuilder videoProcessBuilder = new ProcessBuilder(videoCommand);
            
            try 
            Process process = videoProcessBuilder.inheritIO().start();
                process.waitFor();
            catch (IOException | InterruptedException e) 
                e.printStackTrace();
            

所以,我想知道是否有任何解决方法来使用该库、提供所需的权限或以某种不会触发权限检查的方式运行它。谢谢你。

编辑:

感谢您的回复,我按照答案,服务器在unix下运行,现在我的程序看起来像:

    try 
        
        Runtime.getRuntime().exec("chmod -R 777 " + FilenameUtils.separatorsToSystem(new File(softhware.getFolder() + "/libraries/", "ffmpeg.exe")).getAbsolutePath())).waitFor();
        
             
        Runtime.getRuntime().exec(FilenameUtils.separatorsToSystem(new File(softhware.getFolder() + "/libraries/", "ffmpeg.exe").getAbsolutePath()) + " -hide_banner " + "-loglevel " + "error" + " -i " + video.getVideoFile().getAbsolutePath() + " -q:v " + "0 " +
                    "-start_number " + String.valueOf(framesCount) + " " + new File(video.getFramesFolder().getPath() + "%d.jpg").getAbsolutePath()).waitFor();
        catch (InterruptedException | IOException e) 
              e.printStackTrace();
        

但是现在我执行 .exe 时有一个奇怪的输出,我不知道是什么:

>/home/container/softwares/Player/libraries/ffmpeg.exe: 1: 
MZ����@���: not found
�.ome/container/softwares/Player/libraries/ffmpeg.exe: 2: �
%D����@8: not found
/home/container/softwares/Player/libraries/ffmpeg.exe: 3: Syntax 
error: "(" unexpected

【问题讨论】:

FWIW,在 exe 文件上设置其他人的写权限不是一个好主意。除非你喜欢被黑。 ffmpeg.exe 从文件名看是一个 Windows 程序。堆栈跟踪给人的印象是您在 Linux/Unix 机器上运行。请澄清。 您是否在像 SELinux 这样具有额外安全性的服务器上运行? 我遇到问题的服务器更有可能在 Linux 操作系统下运行,我的 localhost 安装在 Windows 下运行。我在其他托管服务器上测试了我的程序,但仍然遇到同样的问题。 您的问题可能源于使用不同的操作系统,因为您从基本 java 中知道 / 和 \ 不一样,要使用 File.separatorChar -“softwares/player/libraries/ffmpeg.exe “:这是坐在空中的什么地方?? - 我看到你的程序有很多问题,并且良好的调试不是不可能的 - 鉴于我们不能在你的服务器上,你必须自己执行!! 【参考方案1】:

感谢您的回复,我想出了如何解决问题,以及为什么我遇到问题,对于任何来到这里的人,这是解决方案,请按照这些步骤操作;

    服务器没有在 Windows 下运行,正如@gpasch 所说 / 和 \ 不一样,要获得有效路径,我必须使用 apache 方法,例如 FilenameUtils.separatorsToUnix(new File(softhware.getFolder( ) + "/libraries/", "ffmpeg").getAbsolutePath()) 作为 ffmpeg 的字符串路径。

    我遇到的第二个错误(请参阅编辑帖子)来自使用 Windows ffmpeg 而不是 Linux/Unix 的,因此将其删除并用来自 @ 的新错误替换它987654321@。这使我将程序更改为:

        try 
            Runtime.getRuntime().exec("chmod -R 777 " + FilenameUtils.separatorsToUnix(new File(software.getFolder() + "/libraries/", "ffmpeg").getAbsolutePath())).waitFor();
         catch (InterruptedException | IOException e) 
            e.printStackTrace();
        

        String[] videoCommand = 
            FilenameUtils.separatorsToUnix(new File(softhware.getFolder() + "/libraries/", "ffmpeg").getAbsolutePath()),
            "-hide_banner",
            "-loglevel",
            "error",
            "-i",
            FilenameUtils.separatorsToUnix(video.getVideoFile().getAbsolutePath()),
            "-q:v",
            "0",
            "-start_number",
            String.valueOf(framesCount),
            FilenameUtils.separatorsToUnix(new File(video.getFramesFolder().getPath(), "%d.jpg").getAbsolutePath())
        ;

        ProcessBuilder videoProcessBuilder = new ProcessBuilder(videoCommand);

        try 
            Process process = videoProcessBuilder.inheritIO().start();
            process.waitFor();
         catch (IOException | InterruptedException e) 
            e.printStackTrace();
        
    Becarfull 我在成功运行 ffmpeg 15 分钟后删除了我的服务器。

【讨论】:

以上是关于java.io.IOException: error=13, Permission denied while execution an .exe library的主要内容,如果未能解决你的问题,请参考以下文章

java.io.IOException: toDerInputStream 拒绝标签类型 77

java.io.IOException:系统找不到指定的路径

java.io.IOException: Connection reset by peer和java.io.IOException: Connection timed out。Socket

android java.io.IOException:传输端点未连接

任务 ':app:compileDebugKotlin' java.io.IOException 执行失败

Ubuntu Cannot run program "../SDK/build-tools/xxx/aapt": erro = 2 No such file or director