Java命令执行的三种方式

今天学习命令执行的基础知识,

java.lang (Java Platform SE 7 ) (oracle.com)java’的所有基础类汇总

全面详解Maven的配置文件pom.xml(含常用plugin)_maven pom.xml-CSDN博客详解pom.xml

https://stackoverflow.com/questions/75573948/fix-no-primary-or-single-unique-constructor-found-for-interface-javax-servlet-h解决了下面这个问题 import jakarta.servlet.http.HttpServletResponse;

1
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.IllegalStateException: No primary or single unique constructor found for interface javax.servlet.http.HttpServletResponse] with root cause.

Jakarta EE 是由 Eclipse 基金会继承和发展 Java EE 后的新名称,包名从 javax 改为了 jakarta

Runtime

1
2
3
4
String[] command2={"cmd","/c","whoami"};
String[] com3={"cmd","/c","py","-3","dirsearch.py","-u","https://www.baidu.com","-e *"};
Runtime rt = Runtime.getRuntime();
rt.exec(command2);

ProcessImpl

“Process Implementation”,即 “进程实现”

1
2
3
4
5
6
7
8
9
10
11
12
Class clazz = Class.forName("java.lang.ProcessImpl");
Method method = clazz.getDeclaredMethod("start", String[].class,Map.class, String.class, ProcessBuilder.Redirect[].class, boolean.class);
// 获取ProcessImpl类并反射获取start方法
method.setAccessible(true);//setAccessible(true)被调用以绕过Java的访问控制,强制使该方法可访问。
Process process = (Process) method.invoke(null, cmds, null, ".", null,true);
//通过反射调用start方法,传入参数:
//
//cmds: 命令数组,即whoami。
//null: 这个参数代表环境变量。
//".": 表示当前目录作为工作目录。
//null: 这个参数是ProcessBuilder.Redirect[]类型的,用于输入输出重定向,此处未使用。
//true: 该布尔值通常表示是否在不同线程中执行

ProcessBuilder

1
2
3
4
ProcessBuilder pb = new ProcessBuilder();
pb.command("cmd.exe","/c","ping www.baidu.com");
Process p=pb.start();
BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream(), Charset.forName("GBK")));

进一步:

java安全中的命令执行的应用

参考文章

https://www.anquanke.com/post/id/221159 管道符与堆栈情况分析