首页 > 编程语言 >Java命令执行

Java命令执行

时间:2023-05-20 10:57:52浏览次数:35  
标签:lang Java String bos bytes 命令 java 执行 public

(未完待续……)

1. Java的命令执行方式

JDK中提供的可执行系统命令的API有:

  • java.lang.Runtime
  • java.lang.ProcessBuilder
  • java.lang.UNIXProcess(Linux) / java.lang.ProcessImpl(Windows)

2. java.lang.Runtime

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class Test1 {
    public static void main(String[] args) throws IOException {
        try {
            String RuntimeExecRes = RuntimeTest();
            System.out.println(RuntimeExecRes);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static String RuntimeTest() throws IOException {
        //执行whoami命令
        InputStream ins = Runtime.getRuntime().exec("whoami").getInputStream();
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] bytes = new byte[1024];
        int size;
        while ((size = ins.read(bytes)) > 0) {
            bos.write(bytes, 0, size);
        }

        return bos.toString();
    }
}

exec()有多种重载,传入的命令参数可以是字符串或字符串数组,实际是调用ProcessBuilderstart()方法。
image

3. java.lang.ProcessBuilder

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class Test2 {
    public static void main(String[] args) {
        String ProcessExecRes = null;
        try {
            ProcessExecRes = ProcessTest();
            System.out.println(ProcessExecRes);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static String ProcessTest() throws IOException {
        String[] cmds = {"cmd", "/c", "whoami"};
        InputStream ins = new ProcessBuilder(cmds).start().getInputStream();
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] bytes = new byte[1024];
        int size;
        while ((size = ins.read(bytes)) > 0) {
            bos.write(bytes, 0, size);
        }
        return bos.toString();
    }
}

ProcessBuilderstart()方法实际调用的是ProcessImpl.start()方法(在Windows下)。
image

4. java.lang.ProcessImpl

ProcessImpl是最终调用native方法执行系统命令的类。

public class Test3 {
    public static void main(String[] args) {
        try {
            String ProcessImplRes = ProcessImplTest();
            System.out.println(ProcessImplRes);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static String ProcessImplTest() throws Exception {
        String[] cmds = {"whoami"};
        Class clazz = Class.forName("java.lang.ProcessImpl");
        Method method = clazz.getDeclaredMethod("start", new String[]{}.getClass(),
                Map.class, String.class, ProcessBuilder.Redirect[].class, boolean.class);
        method.setAccessible(true);
        InputStream ins = ((Process) method.invoke(null, cmds, null, ".", null, true)).getInputStream();
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] bytes = new byte[1024];
        int size;
        while ((size = ins.read(bytes)) > 0) {
            bos.write(bytes, 0, size);
        }
        return bos.toString();
    }
}

注:在JDK17会报错:

java.lang.reflect.InaccessibleObjectException: Unable to make static java.lang.Process java.lang.ProcessImpl.start(java.lang.String[],java.util.Map,java.lang.String,java.lang.ProcessBuilder$Redirect[],boolean) throws java.io.IOException accessible: module java.base does not "opens java.lang" to unnamed module @41629346

需要添加JVM参数:--add-opens java.base/java.lang=ALL-UNNAMED

5. 防御

  • 配置SecurityManager规则。
  • RASP

标签:lang,Java,String,bos,bytes,命令,java,执行,public
From: https://www.cnblogs.com/KRDecad3/p/17416883.html

相关文章

  • Linux文件管理命令
    vim跳转到80行80gg跳转到第一行gg跳转到最后一行G删除一行dd撤销上一步的操作u大文件切割#将test.txt文件每10M大小切割成一个小文件split-b10Mtest.txt#把小文件合并成大文件catx*>test.txtfind-name区分大小写-iname忽略大小写-regex区分大小写的正则表达式......
  • ulimit 命令详解
    Linux对于每个用户,系统限制其最大进程数。为提高性能,可以根据设备资源情况,设置各linux用户的最大进程数可以用ulimit-a来显示当前的各种用户进程限制。下面我把某linux用户的最大进程数设为10000个:   ulimit-u10240   对于需要做许多socket连接并使它们处于......
  • Linux进程命令
    proc系统查看进程占用的物理内存top-p{pid}查看进程占用的内存cat/proc/{pid}/statusVmRSS是进程占用的物理内存fuser查看使用的文件的进程fuser-umv/proc查看启动指定端口的进程fuser-v2379/tcplsof查看进程使用的文件lsof|grepkubelet|head-n10pido......
  • Java文件与IO流
    首先我们要清楚什么是流,正如其名,很形象,流就是像水一样的东西,具有方向性,在java中,流大概就是类接下来,我们要对输入输出流有一个基本认识,什么是输入输出流呢?输入输出明显需要一个参照,而这个参照就是主存。清楚了上面的概念,我们接着看下去吧。文件文件的创建文件创建共有三种......
  • Get-MMagent 是一个命令,通常用于查询与 Microsoft Management Agent (MMAgent) 相关的
    Get-MMagent是一个命令,通常用于查询与MicrosoftManagementAgent(MMAgent)相关的属性和配置信息。MMAgent是一款基于云计算技术的软件代理程序,用于帮助配置管理、安全性和监视方案。在Windows平台上,MMAgent通常用于实现高效的云端管理和自动化操作,包括AzureMonitor等相......
  • 使用ln命令在Linux系统中创建连接文件
    在Linux中ln命令用来为文件创建连接,连接类型分为硬连接(HardLink)和符号连接(SymbolicLink)两种,默认的连接类型是硬连接。如果要创建符号连接必须使用"-s"选项。关于软硬连接解释硬连接硬连接是指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是......
  • golang命令行cobra 快速入门教程
    cobra也许是go语言现有最好的命令行框架了,在各大项目中皆有使用,比如最出名的kubernetes,所以要写一个稍微复杂的命令行工具,使用cobra还是不错的,cobra内置了非常多有用的功能,包括但不限于,自动生成帮助文档,生成命令行代码的脚手架工具,智能提示等等。命令行相关知识在学习cobr......
  • java调用python并且实现RESTAPI
    在Eclipse中创建springboot工程(maven)配置pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocati......
  • 【大数据】Presto(Trino)REST API 与执行计划介绍
    目录一、概述二、环境准备三、常用RESTAPI1)worker节点优雅退出2)提交SQL查询请求3)获取查询状态4)获取查询结果5)取消查询请求6)获取Presto节点信息7)获取Presto服务器使用统计信息8)获取查询计划四、Presto(Trino)执行计划一、概述Presto(现在叫Trino)是一个分布式SQL查询引擎,它允许......
  • java基于springboot+vue的漫画网站管理系统,附源码+数据库+lw文档+PPT,适合毕业设计、课
    1、项目介绍考虑到实际生活中在漫画网站方面的需要以及对该系统认真的分析,将系统权限按管理员和用户这两类涉及用户划分。(a)管理员;管理员使用本系统涉到的功能主要有:首页、个人中心、用户管理、漫画分类管理、漫画投稿管理、分类管理、排行榜管理、交流论坛、系统管理等功能......