Topic: 关于Runtime.exec()的问题

  Print this page

1.关于Runtime.exec()的问题 Copy to clipboard
Posted by: cxp108
Posted on: 2004-08-30 16:18

代码如下(在RedHat 9.0下运行)

String[] s = {"/bin/bash","-c","/bin/su","-c","/home/ctc/commapp.bin"};
String cmd = "su -c /home/ctc/commapp.bin";

try{

Runtime.getRuntime().exec( s );
Runtime.getRuntime().exec(cmd);

}catch(Exception ex){

ex.printStackTrace();

}

其中 s 和 cmd 的路径和可执行文件名绝对是正确无误的,但两个进程
的执行结果总是:

a, 产生的进程立刻消失或根本没有产生(在shell 里面可正常执行)

b, 执行期间未抛出任何异常

问题是:

a, 这是否有可能是JVM自己的安全限制(我还未看到相关的文档有提到该
问题, 不知道大家有没有看到过)

b, 还有其他的方式可以决绝这个问题吗(在没有commapp.bin代码的情况下)

2.Re:关于Runtime.exec()的问题 [Re: cxp108] Copy to clipboard
Posted by: cxp108
Posted on: 2004-08-30 17:12

自己试了一下用:

SecurityManager的 checkExec(String cmd);

的方法,结果抛出了

access denied (java.io.FilePermission <<ALL FILES>> execute)

java.security.AccessControlException: access denied

的异常,看来是没什么希望了,不知道版主有没有其他办法推荐?

3.Re:关于Runtime.exec()的问题 [Re: cxp108] Copy to clipboard
Posted by: why
Posted on: 2004-08-30 21:29

cxp108 wrote:
自己试了一下用:

SecurityManager的 checkExec(String cmd);

的方法,结果抛出了

access denied (java.io.FilePermission <<ALL FILES>> execute)

java.security.AccessControlException: access denied

的异常,看来是没什么希望了,不知道版主有没有其他办法推荐?

Have you checked the java.security or java.policy file -- I have fogotten which one -- and grant the proper access permission?

4.Re:关于Runtime.exec()的问题 [Re: cxp108] Copy to clipboard
Posted by: floater
Posted on: 2004-08-30 21:31

i don't know what you are trying to do.

5.Re:关于Runtime.exec()的问题 [Re: cxp108] Copy to clipboard
Posted by: joelwx
Posted on: 2004-08-30 22:42

jdk/bin/policytool.exe 可以为你的CLASS/JAR设置FILE PERMISSION,研究一下吧!god will bless u!

6.Re:关于Runtime.exec()的问题 [Re: cxp108] Copy to clipboard
Posted by: cxp108
Posted on: 2004-08-31 09:37

呵呵,没表达清楚!

这个程序是我在Linux上写的服务器程序,其主要功能是启动

几个由C写的本地程序进程(这些进程为网络中的某些客户提供服务)

其中有一个名为commapp的进程,需要使用root权限运行因此必须用

su -c "....." 这种方式运行,程序实验阶段root不设置任何密码,连空

密码都没有,也就是说运行su命令时系统根本不会要求输入密码

在启动这些进程的同时获得其进程对象(Process),并启动GUI对这些进程进行

管理(如:获取其标准输出并进行排序,管理进程的启动和结束等)

由于该程序在是本地运行的应用,默认的权限应该是AllPermission才对

我用SecurityManager的 checkExec("su -c /home/ctc/commapp.bin");

检查运行该条命令的权限,抛出了该异常

access denied (java.io.FilePermission <<ALL FILES>> execute)

java.security.AccessControlException: access denied

java.io.FilePermission 明明已经是 <<ALL FILES>> 了

为什么还会access denied?

希望大家能尽量帮忙,这对我很重要,直接关系到项目的成败问题!!

谢谢大家.

7.Re:关于Runtime.exec()的问题 [Re: cxp108] Copy to clipboard
Posted by: floater
Posted on: 2004-08-31 09:51

ok, let's seperate what you want to do and what you did for the troubleshooting.

You want to run a unix command through exec, now what did you get when you run it?? This will let us know what's wrong.

can you run it under unix?

a side note, never never su to root to run anything, even for testing. You don't want to look for trouble, Tounge. Just create a new user for that. I haven't been su'd to root for years, feel so good when I could do it, THE POWER!

8.Re:关于Runtime.exec()的问题 [Re: cxp108] Copy to clipboard
Posted by: cxp108
Posted on: 2004-08-31 10:13

当我运行exec("su -c /home/ctc/commapp.bin")时出现了以下情况

a, 产生的进程立刻消失或根本没有产生(在shell 里面可正常执行)

b, 执行期间未抛出任何异常

在Linux 下可以直接运行 su -c /home/ctc/commapp.bin 没有任何问题

求助:

我使用exec的方式是否有错误?

问题到底出在哪?

有什么方法可以绕过exec来生成我的进程?

9.Re:关于Runtime.exec()的问题 [Re: cxp108] Copy to clipboard
Posted by: cxp108
Posted on: 2004-08-31 10:14

小弟虽然用Linux和UNIX只有2个年头,但是对于root的威力还是有相当

"震撼"性的认识,但无奈commapp.bin是别人写的程序,它是一个要求必

须在root下运行的守护进程,否则我也不会走exec这条路(我可是个夸平

台的死硬分子Tounge),我宁愿自己在java中实现它

10.Re:关于Runtime.exec()的问题 [Re: cxp108] Copy to clipboard
Posted by: floater
Posted on: 2004-08-31 11:16

Try this

Runtime rt = Runtime.getRuntime();
Process pcs = rt.exec("your command");
BufferedReader br = new BufferedReader(new InputStreamReader(pcs.getInputStream()));
String line = null;
while((line = br.readLine()) != null)
{
System.out.println(line);
}
br.close();
pcs.waitFor();
int ret = pcs.exitValue();
System.out.println(ret);

11.Re:关于Runtime.exec()的问题 [Re: cxp108] Copy to clipboard
Posted by: think
Posted on: 2004-08-31 12:11

Runtime.getRuntime().exec(...)返回Process类,你可以检查一下它的getInputStream()和getErrorStream()方法,看看有没有什么信息。
我曾经用Runtime.getRuntime().exec(...)编译过java代码,没什么问题的。

12.Re:关于Runtime.exec()的问题 [Re: cxp108] Copy to clipboard
Posted by: 烂泥
Posted on: 2004-08-31 12:34

http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html

13.Re:关于Runtime.exec()的问题 [Re: cxp108] Copy to clipboard
Posted by: cxp108
Posted on: 2004-08-31 14:13

我终于发现自己表达毛病所在了..............

实在是惭愧!EmbaressedEmbaressedEmbaressedEmbaressedEmbaressed

其实,我已经用Runtime.exec()生成数个进程了(都是直接运行一个本地的

二进制文件,如:Runtime.exec("/home/ctc/commsrv.bin")),它们都工作正常

并在控制之下,唯独当我用Runtime.exec("su -c /home/ctc/commapp.bin")

生成进程时出现问题.

浪费大家诸多宝贵时间,实在抱歉!(尤其是floater......)

现在经反复实验后,我得出以下结论:

Runtime.exec()不能运行 Linux 下的 su 命令,这可能是由Java 虚拟机和

Linux Shell这两重安全机制同时决定的.

14.Re:关于Runtime.exec()的问题 [Re: cxp108] Copy to clipboard
Posted by: xiaopa
Posted on: 2004-08-31 15:58

如果直接把java本身的提升到root用户运行应该可以解决这个问题,但是安全上要考虑的问题就多了。

15.Re:关于Runtime.exec()的问题 [Re: cxp108] Copy to clipboard
Posted by: xiaopa
Posted on: 2004-08-31 16:12

这样不知道可不可以?
Runtime.getRuntime().exec("sh bin/su -c /home/ctc/commapp.bin");

16.Re:关于Runtime.exec()的问题 [Re: xiaopa] Copy to clipboard
Posted by: cxp108
Posted on: 2004-08-31 17:21

xiaopa wrote:
这样不知道可不可以?
Runtime.getRuntime().exec("sh bin/su -c /home/ctc/commapp.bin");


试过了,不行

17.Re:关于Runtime.exec()的问题 [Re: cxp108] Copy to clipboard
Posted by: floater
Posted on: 2004-08-31 22:03

cxp108 wrote:
我终于发现自己表达毛病所在了..............

实在是惭愧!EmbaressedEmbaressedEmbaressedEmbaressedEmbaressed

其实,我已经用Runtime.exec()生成数个进程了(都是直接运行一个本地的

二进制文件,如:Runtime.exec("/home/ctc/commsrv.bin")),它们都工作正常

并在控制之下,唯独当我用Runtime.exec("su -c /home/ctc/commapp.bin")

生成进程时出现问题.

浪费大家诸多宝贵时间,实在抱歉!(尤其是floater......)

现在经反复实验后,我得出以下结论:

Runtime.exec()不能运行 Linux 下的 su 命令,这可能是由Java 虚拟机和

Linux Shell这两重安全机制同时决定的.

If my memory serves me right, I think it's RedHat linux's restriction, google it.

18.Re:关于Runtime.exec()的问题 [Re: cxp108] Copy to clipboard
Posted by: cxp108
Posted on: 2004-09-01 11:23

了解


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923