2010-06-21 2 views
11

Mac에서 Java 프로그램과 함께 실행하려고하는 실행 파일 (ffmpeg)이 있습니다. 나는 명령 chmod 777 /path/to/ffmpeg을 보낼 자바 프로그램을 사용하여,하지만 난는 FFmpeg를 실행하려고하면, 나는 다음과 같은 오류 얻을 :chmod 명령에 대한 Java의 권한 거부 오류

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

을하지만 자바 응용 프로그램을 열기 전에 내 자신의 터미널에서 다음 명령을 chmod 777 /path/to/ffmpeg을 실행할 때 ffmpeg는 Java 프로그램에서 정상적으로 실행됩니다.

Java 프로그램 내에서 chmod을 호출하고 직접 호출하는 것의 차이점은 무엇입니까? 왜 작동하지 않을까요? 고맙습니다!

+0

아마 해당 파일을 –

+0

세부 사항을 chmod를 할 수있는 권한을 가지고 있지 않은 사용자와 자바 실행 파일을 실행하는 ... 내가 돈 Mac에서는 모르지만 일반 사용자는 GNU/Linux에서 chmod 777을 사용할 수 없습니다 (일부 권한은 "숨김"입니다). 그래서 터미널에서 시도 할 때 실제로 할 수있는 종류의 사용자 일 가능성이 있습니다 당신이 할 수없는 사용자로 자바를 실행하는 동안 그런 건? (보안을 강화하기 위해 "파워"사용자로 실행할 때 java VM이 권한을 삭제할 수도 있습니다) – ShinTakezou

답변

4

chmod은 실행 파일이 아닌 셸 명령이라고 생각합니다. 쉘을 통해 chmod을 실행 해보십시오. 자세한 내용은 여기를 참조하십시오 : Want to invoke a linux shell command from Java

+0

정말 고마워 Carl, 완벽하게 bash로 실행! –

+0

'chmod'는 나를 위해'/ bin/chmod'를 말합니다. 그래서 bash-3.2.48에서는 쉘 내장이 아닌 실행 파일입니다. 아마도 Java를 시작하는 곳은 실행 가능한 검색 경로에 있지 않지만 쉘을 호출하면 PATH를 복구하는 사용자 쉘 구성 스크립트가 실행됩니다. –

4

예, 차이가 있습니다. 터미널에서 명령을 실행할 때 작업을 수행하는 사람이 귀하의 자격 증명을 사용하여 수행됩니다. Java 응용 프로그램은 Java 응용 프로그램의 권한을 사용하여 명령을 실행 중입니다. 이것은 응용 프로그램이 실행되지 않도록하고 파일 시스템에 위험한 변경을 가하는 것을 방지하기위한 것입니다. 아마도 다른 사람이이 문제를 해결하기 위해 정교하고 지침을 줄 수 있습니다.

+0

감사합니다. Ryan! 분명히 Java 내에서 프로그램을 실행하는 방법이 있습니다. 무엇에 관한 아이디어가 있습니까? –

+0

확실하지 않습니다. 보안상의 이유로 ShinTakezou의 질문에 대한 의견이 말했듯이, 설계 상 허용되어서는 안되는 것 같습니다. CarlG의 답변을 시도해 보셨습니까? Linux에서 작동하는 경우 Mac OS에서 시도해 볼 가치가 있습니다. –

2

현재 OSX에서 FFMpeg를 사용하는 프로젝트를 진행 중입니다. 나는 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 파일도 지나치게 복잡 할 수도 있지만 작동합니다.

소스는 특히이 두 파일 난 그냥 내 코드에서 동일한 문제가 있었다 당신

FFMpegEncoderOSX.java

FileUtil.java

+0

답변 해 주셔서 감사합니다. 나는 그 명령을 실행하고있다. 그러나 여전히 허가를 거부하고있다. 어떤 아이디어? –

5

에 대한 흥미로운 일이 될 수도 http://korsakow.net

에서 볼 수 있습니다. 나는이 문제를 exec 뒤에 추가 waitFor로 해결했다. 다음 명령을 실행하면 "chmod"프로세스가 완료되지 않습니다.

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

이 시도해보십시오 : 같은 코드가 보일 수 있습니다

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