Разрешение отклонено в Java для команды chmod

У меня есть исполняемый файл (ffmpeg), который я пытаюсь запустить с помощью программы Java на Mac. Я использовал программу Java для отправки команды chmod 777 /path/to/ffmpeg, но когда я пытаюсь запустить ffmpeg, я получаю следующую ошибку:

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

Но когда я запускаю chmod 777 /path/to/ffmpeg из терминала самостоятельно, прежде чем открывать приложение Java, команда ffmpeg будет отлично работать в программе Java.

Есть ли разница между вызовом chmod из программы Java и вызовом его самостоятельно? Почему это не сработает? Спасибо!

Ответ 2

У меня была такая же проблема в моем коде. Я решил это, добавив waitFor после exec. Процесс "chmod" не завершается при выполнении следующей команды. код может выглядеть так:

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

Ответ 3

Да, есть разница. Когда вы выполняете команду с терминала, вы выполняете действие, и, таким образом, оно выполняется с использованием ваших учетных данных. Приложение Java запускает команду, используя разрешения Java-приложений. Это делается для предотвращения запуска приложения и последующего внесения опасных, нежелательных изменений в файловую систему. Возможно, кто-то еще может разработать и дать указания об обходном пути для этого.

Ответ 4

В настоящее время я работаю над проектом, который также использует FFMpeg для OSX. Я храню FFMpeg в JAR и извлекаю его и устанавливаю исполняемый файл при использовании, как вы, кажется, делаете. Это то, что я делаю, и это работает.

public static void setExecutable(File file, boolean executable)
{
    Process p = Runtime.getRuntime().exec(new String[] {
        "chmod",
        "u"+(executable?'+':'-')+"x",
        file.getAbsolutePath(),
    });
    // do stuff to make sure p finishes & capture output
}

Код GPL, поэтому не стесняйтесь его проверить. Его не самая лучшая база кода, и даже материал FFMpeg, возможно, слишком сложный, но он работает.

Источник доступен для просмотра http://korsakow.net

Эти два файла, в частности, могут быть вам интересны

FFMpegEncoderOSX.java

FileUtil.java

Ответ 5

Попробуйте следующее:

commandFile.setExecutable(true);
Process p = Runtime.getRuntime.exec(commandFile.getAbsoluteFile());