为什么应该避免在Java中使用Runtime.exec()?

15
   Process p = Runtime.getRuntime().exec(command);
   is = p.getInputStream();
   byte[] userbytes = new byte[1024];
   is.read(userbytes);

我想从Java中执行Linux操作系统中的一条shell命令。但是PMD报告说不要使用Java Runtime.exec(),为什么?有什么原因吗?有没有Runtime.exec()的替代方法呢?


2
PMD 显示了什么样的信息? - Tudor
问题描述:不要使用Runtime.exec()来执行命令。 - kannanrbk
2
这是一个荒谬的陈述,完全没有任何支持。 - ControlAltDel
避免执行Runtime.exec()方法的原因是什么?这会导致任何注入吗? - kannanrbk
1个回答

41

除非你使用的是古老的JVM,否则java.lang.ProcessBuilder会使指定进程、设置其环境、生成它以及处理其文件描述符变得更加容易。

这个类被用来创建操作系统进程。

每个ProcessBuilder实例管理一组进程属性。 start()方法使用这些属性创建一个新的Process实例。可以从同一实例重复调用start()方法,以创建具有相同或相关属性的新子进程。

...

启动一个新进程并使用默认工作目录和环境很容易:

 Process p = new ProcessBuilder("myCommand", "myArg").start();

以下是一个示例,它使用修改过的工作目录和环境来启动进程:

 ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
 Map<String, String> env = pb.environment();
 env.put("VAR1", "myValue");
 env.remove("OTHERVAR");
 env.put("VAR2", env.get("VAR1") + "suffix");
 pb.directory(new File("myDir"));
 Process p = pb.start();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接