2010-09-18 41 views
3

是否有可能調用shellscript或shellcode中的java類?在java中調用shell腳本?

我的代碼(在一個靜態方法):

Runtime rtime = Runtime.getRuntime(); 
Process child = rtime.exec("/bin/bash"); 
BufferedWriter outCommand = new BufferedWriter(new 
OutputStreamWriter(child.getOutputStream())); 
outCommand.write("streamer -c /dev/video0 -b32 -o test.jpeg"); 
outCommand.flush(); 
outCommand.close(); 
child.destroy(); 

,但我得到這個錯誤,如果我在jsp頁面(tomcat6中)試試這個代碼:

java.security.AccessControlException:訪問(java.io.FilePermission/bin/bash execute)

這個問題的任何解決方案?

EDIT: LS -l /斌/慶典顯示我follwing線:

-rwxr-XR-X 1根根875596 2009-09-14 07:09 /斌/慶典

謝謝

+1

您使用的是Tomcat的打包版本嗎?如果是的話,它具有非常嚴格的權限。 – 2010-09-18 22:55:42

+0

嗯..不知道下載apt-get安裝tomcat6 – Benni 2010-09-18 23:05:04

回答

1

嘗試禁用安全管理器。編輯/etc/init.d/tomcat6和改變:

TOMCAT_SECURITY=yes 

修改成:

TOMCAT_SECURITY=no 

然後重新啓動Tomcat:

/etc/init.d/tomcat6 restart 

如果它的工作原理,它是由你來看看是否完全禁用安全經理是否可以接受(使用它實際上是不尋常的國際海事組織)。

1

另外如果可能的話,嘗試在單個exec調用中運行它。其中args是參數的字符串數組。

String[] args = new String[] {"/bin/bash", "streamer", "-c", "/dev/video0", "-b32", "-o", "test.jpeg" }; 
+0

是的,強烈建議傳遞參數作爲單獨的字符串,特別是如果任何可能會嘗試執行一些shell代碼注入的用戶更改它們中的任何一個。 – jbindel 2010-09-19 01:15:26

3

如果你想保持安全管理運行情況,你可能有很好的理由這樣做,那麼你可以簡單地更改Tomcat正在使用的策略文件。這些文件可能位於/var/lib/tomcat6/conf/policy.d

A nice SO thread discusses this已經。即使您將AllPermissions授予您的應用程序,運行SecurityManager也可讓您使用安全性有限的沙箱。您可能想要這樣做,比如說運行可以在運行時上傳的JavaScript或類似的東西,或者您的應用程序中可能有其他一些代碼因爲某些原因而不信任。

+0

我的意思是「有限權限的沙箱」。 – jbindel 2010-09-19 01:53:32

+0

如果有多個網絡應用程序正在運行,您可能不希望它們都有空閒的統治。 – jbindel 2010-09-19 02:39:54