2010-06-21 7 views
11

Mam plik wykonywalny (ffmpeg), który próbuję uruchomić z programem Java na komputerze Mac. Użyłem programu Java, aby wysłać polecenie chmod 777 /path/to/ffmpeg, ale gdy próbuję uruchomić ffmpeg, pojawia się następujący błąd:Błąd odmowy uprawnień w Javie dla polecenia chmod

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

Ale kiedy biegnę chmod 777 /path/to/ffmpeg od terminalu na własną rękę przed otwarciem aplikacja Java komendę ffmpeg będzie działał dobrze w programie Java.

Czy istnieje różnica między wywołaniem chmod z poziomu programu Java i wywoływaniem go samodzielnie? Dlaczego to nie zadziała? Dziękuję Ci!

+0

może używasz wykonywalny java z użytkownikiem, który nie ma uprawnień do tego pliku chmod –

+0

szczegółów ... I don na komputerze Mac, ale na GNU/Linux jako zwykły użytkownik nie mogłeś zrobić 'chmod 777' (niektóre uprawnienia są" zamaskowane "), więc jest to możliwe, gdy próbujesz z terminalu, rzeczywiście jesteś typem użytkownika, który może zrobić coś takiego, podczas uruchamiania java jako użytkownik, który nie może? (Możliwe jest również, że java vm upuszcza przywileje, gdy działa jako użytkownik "zasilający", tylko po to, aby zwiększyć bezpieczeństwo). – ShinTakezou

Odpowiedz

4

Domyślam się, że chmod jest poleceniem powłoki, a nie plikiem wykonywalnym. Spróbuj uruchomić chmod przez powłokę. Zobacz więcej szczegółów tutaj: Want to invoke a linux shell command from Java

+0

Dziękuję bardzo Carl, działało idealnie, aby uruchomić go z bash! –

+0

'który chmod' mówi dla mnie'/bin/chmod', więc pod bash-3.2.48 jest wykonywalnym, a nie wbudowanym powłoką. Być może cokolwiek uruchamia Javę, nie ma go w ścieżce szukanego pliku, ale wywołanie powłoki uruchamia skrypty konfiguracyjne powłoki użytkownika naprawiające PATH. –

4

Tak, jest różnica. Po uruchomieniu polecenia z terminala wykonujesz tę czynność, co oznacza, że ​​jest wykonywana przy użyciu poświadczeń. Aplikacja Java uruchamia polecenie przy użyciu uprawnień aplikacji Java. Ma to zapobiec uruchomieniu aplikacji, a następnie wprowadzeniu niebezpiecznych, niechcianych zmian w systemie plików. Być może ktoś inny może opracować i podać wytyczne dotyczące obejścia tego problemu.

+0

Dzięki Ryan! Z pewnością istnieje sposób na uruchomienie programu w Javie. Wszelkie pomysły na temat tego, co robić? –

+0

Nie jestem pewien. Wygląda na to, że nie powinno to być dozwolone przez projekt, jak mówi komentarz ShinTakezou na twoje pytanie, ze względów bezpieczeństwa. Czy wypróbowałeś odpowiedź CarlG? Jeśli działa na Linuksie, zdecydowanie warto spróbować w systemie Mac OS. –

2

Obecnie pracuję nad projektem, który również wykorzystuje FFMpeg na OSX. Przechowuję FFMpeg w pliku JAR i rozpakowuję go i ustawiam plik wykonywalny na użytek, jak ci się wydaje. To właśnie robię i wydaje mi się, że działa.

 
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 
} 

Kod to GPL, więc możesz go wypróbować. Nie jest to najładniejsza baza kodu, a nawet pliki FFMpeg są prawdopodobnie zbyt skomplikowane, ale działa.

źródłowy jest widoczny na http://korsakow.net

Te dwa pliki w szczególności może być dla Ciebie interesujący

FFMpegEncoderOSX.java

FileUtil.java

+0

Dzięki za odpowiedź, doceniam to! Używam tego polecenia, ale nadal daje on błąd odmowy uprawnień. Jakieś pomysły, dlaczego? –

5

prostu miałem ten sam problem w moim kodu. Rozwiązałem to przez dodanie waitFor po exec. Proces "chmod" nie jest kończony po wykonaniu następnego polecenia. kod może wyglądać następująco:

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

Spróbuj tego:

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