2010-09-18 83 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