java.io.IOException: 错误=13,执行 .exe 库时权限被拒绝
java.io.IOException: error=13, Permission denied while executing an .exe library
我的 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)
我试图通过 Java 代码更改 ffmpeg.exe 文件的权限,例如 ffmpegFile.setExecutable(true)、File.setReadable(true)、File.setWritable(true) 但未成功,还尝试通过我的 FileZilla 软件将文件权限更改为 777,但再次失败:
奇怪的是服务器重启后权限又回到了750,但即使在重启之前它也不起作用。
可能与:Permission denied error in Java for chmod command 相关,我尝试 运行ning 其他使用 .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 下 运行ning,现在我的程序看起来像:
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
感谢您的回复,我想出了解决问题的方法,以及为什么会出现问题,对于任何来到这里的人,这里是解决方案,请按照这些步骤操作;
服务器不在 运行 下 Windows,正如@gpasch 所说 / 和 \ 不一样,为了获得有效路径,我必须使用 apache方法,例如 FilenameUtils.separatorsToUnix(new File(softhware.getFolder() + "/libraries/", "ffmpeg").getAbsolutePath()) 作为 ffmpeg 的字符串路径。
我遇到的第二个错误(请参阅编辑 post)是因为使用了 Windows ffmpeg 而不是一个 Linux/Unix 个,所以将其删除并用 https://ffbinaries.com/downloads 中的一个新的替换它。这让我将程序更改为:
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();
}
- 因为我成功删除了我的服务器,15 分钟后 运行 ffmpeg。
我的 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)
我试图通过 Java 代码更改 ffmpeg.exe 文件的权限,例如 ffmpegFile.setExecutable(true)、File.setReadable(true)、File.setWritable(true) 但未成功,还尝试通过我的 FileZilla 软件将文件权限更改为 777,但再次失败:
奇怪的是服务器重启后权限又回到了750,但即使在重启之前它也不起作用。
可能与:Permission denied error in Java for chmod command 相关,我尝试 运行ning 其他使用 .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 下 运行ning,现在我的程序看起来像:
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
感谢您的回复,我想出了解决问题的方法,以及为什么会出现问题,对于任何来到这里的人,这里是解决方案,请按照这些步骤操作;
服务器不在 运行 下 Windows,正如@gpasch 所说 / 和 \ 不一样,为了获得有效路径,我必须使用 apache方法,例如 FilenameUtils.separatorsToUnix(new File(softhware.getFolder() + "/libraries/", "ffmpeg").getAbsolutePath()) 作为 ffmpeg 的字符串路径。
我遇到的第二个错误(请参阅编辑 post)是因为使用了 Windows ffmpeg 而不是一个 Linux/Unix 个,所以将其删除并用 https://ffbinaries.com/downloads 中的一个新的替换它。这让我将程序更改为:
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();
}
- 因为我成功删除了我的服务器,15 分钟后 运行 ffmpeg。