2010-06-21 61 views
11

我有一個可執行文件(ffmpeg),我試圖在Mac上使用Java程序運行。我使用的Java程序發送命令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打開Java應用程序之前,命令到ffmpeg將在Java程序中運行得很好。

從Java程序內調用chmod並自己調用它之間有區別嗎?爲什麼它不起作用?謝謝!

+0

也許您正在使用誰沒有得到特權和chmod該文件 – 2010-06-21 15:18:44

+0

詳細用戶的Java可執行文件...我不不知道在Mac上,但在GNU/Linux上作爲普通用戶,你不能執行'chmod 777'(某些權限被「屏蔽」),所以當你從終端嘗試時,你確實可以做那種用戶這樣的事情,而你作爲一個用戶不能運行的Java? (當運行「強大」用戶時,java虛擬機也可能會丟棄特權,只是爲了增強安全性) – ShinTakezou 2010-06-21 15:24:51

回答

4

我猜chmod是一個shell命令,而不是一個可執行文件。嘗試通過您的shell運行chmod。在此處查看更多詳細信息:Want to invoke a linux shell command from Java

+0

非常感謝卡爾,它完美地運行它與bash! – 2010-06-24 04:16:52

+0

'chmod'對我來說是'/ bin/chmod',所以在bash-3.2.48下它是一個可執行文件,而不是shell內建的。也許無論啓動Java在可執行文件搜索路徑中沒有它,但調用shell運行用戶shell配置腳本修復PATH。 – 2011-11-15 16:16:57

4

是的,有區別。當您從終端運行命令時,您是誰在執行操作,因此它是使用您的憑據執行的。 Java應用程序使用Java應用程序的權限運行命令。這是爲了防止應用程序運行,然後對文件系統進行危險的不需要的更改。也許別人可以詳細說明併爲此提供解決方法。

+0

感謝Ryan!當然有一種方法可以在Java中運行程序。有什麼想法做什麼? – 2010-06-21 15:35:00

+0

不確定。看起來這不應該被設計所允許,就像ShinTakezou對你的問題的評論所說的,出於安全原因。你有沒有試過CarlG的答案?如果它在Linux上運行,那麼它絕對值得在Mac OS上嘗試。 – 2010-06-21 15:41:17

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的東西也許過於複雜,但它的工作原理。

來源是http://korsakow.net

可視尤其是這兩個文件可能會爲你

FFMpegEncoderOSX.java

FileUtil.java

+0

感謝您的回答,我很感激!我正在運行該命令,但它仍然給予權限被拒絕的錯誤。任何想法爲什麼? – 2010-06-23 18:51:28

5

我有同樣的問題在我的代碼很有趣。 我解決了這個問題,在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());