Java命令执行浅析
一、Java执行命令的几种方式
1、java.lang.Runtime
Runtime.getRuntime().exec("calc");
Runtime.getRuntime().exec(new String[]{"cmd", "/c", "whoami"});
主要分为两大类:
第一类入参为String类型
第二类入参为String[]类型
2、java.lang.ProcessBuilder
ProcessBuilder pb = new ProcessBuilder("whoami");
pb.start();
new ProcessBuilder("cmd", "/c", "net user").start();
new ProcessBuilder(list).start();
构造方法如下两类:
public ProcessBuilder(String... command)
public ProcessBuilder(List<String> command)
3、java.lang.ProcessImpl
Class clazz = Class.forName("java.lang.ProcessImpl");
Method method = clazz.getDeclaredMethod("start", String[].class, Map.class, String.class, ProcessBuilder.Redirect[].class, boolean.class);
method.setAccessible(true);
method.invoke(null, new String[]{"calc"}, null, null, null, false);
该类非Public修饰,所以在不同包下只能通过反射的方式去调用执行。
二、动态调试
跟进java.lang.Runtime类的调用过程:
调用Runtime.getRuntime()方法返回currentRuntime静态成员对象,
继续调用exec方法,这里exec方法重载,有多种同名不同参数类型方法,我们跟进参数为 (String command)的exec方法,继续往下走(exec方法返回类型均为Process抽象类):
进入public Process exec(String command, String[] envp, File dir) 方法: