java的runtime执行命令的缺点(javaruntime参数设置)

技术Java Runtime的使用方法是什么这篇文章将为大家详细讲解有关Java Runtime的使用方法是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前言最近做项

本文将详细解释如何使用JavaRuntime。文章内容质量较高,边肖将分享给大家参考。希望你看完这篇文章后有所了解。

00-1010最近在做项目框架,需要在框架结束时关闭服务器连接,清除框架的一些锁文件。在这里,我想到了shutdownhook,并学习了Runtime的用法。

前言

演示示例,证明程序正常结束时会调用。如果杀-9,肯定不会叫。

publicclassShutdownHookTest {

publicationstativitmain(String[]args){ 0

system . out . println('==================application start=================');

Runtime.getRuntime()。addshuttdowhook(new thread(()-{ 0

system . out . println('-hook 1-');

}));

Runtime.getRuntime()。addshuttdowhook(new thread(()-{ 0

system . out . println('-hook 2-');

}));

system . out . println('==================application end================');

}

}正常操作结束,结果如下。

===============应用程序启动=====================

================应用程序结束====================

-钩子1 -

钩子2

进程已完成,退出代码为0

如果暂停,请单击下图左下角的红色方形图标停止运行应用程序。

JavaRuntime的使用方法是什么

因此,shutdownhook已被执行。

JavaRuntime的使用方法是什么

Shutdownhook可以处理删除文件、关闭连接等操作。当程序正常结束时。

1. shutdownhook

2. exec执行

演示示例如下,例如ls

publicclassShutdownHookTest {

publicationstatinvitmain(String[]args)throwsInt

erruptedException, IOException {
        Process process = Runtime.getRuntime().exec("ls"); 
        try (InputStream fis = process.getInputStream();
             InputStreamReader isr = new InputStreamReader(fis);
             BufferedReader br = new BufferedReader(isr)) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        }
    }
}

结果如下

Java Runtime的使用方法是什么

而正常执行结果

Java Runtime的使用方法是什么

但是这个方法有远程执行风险,即在浏览器端通过这个方法执行特定指令,比如执行rm -rf *,结果就很……

2.2 管道符

但是遇见管道符之后就会失效,什么办法解决,sh -c,但是不能直接用,否则获取到的是TTY窗口信息

public static void main(String[] args) throws IOException {
        Process process = Runtime.getRuntime().exec("sh -c ps aux|grep java"); 
        try (InputStream fis = process.getInputStream();
             InputStreamReader isr = new InputStreamReader(fis);
             BufferedReader br = new BufferedReader(isr)) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        }
    }

结果????

Java Runtime的使用方法是什么

sh -c的参数要分离,不然runtime会认为是一个参数

Java Runtime的使用方法是什么

2.3源码分析

跟踪代码,使用ProcessImpl来执行指令

public Process exec(String[] cmdarray, String[] envp, File dir)
        throws IOException {
        return new ProcessBuilder(cmdarray)
            .environment(envp)
            .directory(dir)
            .start();
    }

ProcessBuilder

// Only for use by ProcessBuilder.start()
    static Process start(String[] cmdarray,
                         java.util.Map<String,String> environment,
                         String dir,
                         ProcessBuilder.Redirect[] redirects,
                         boolean redirectErrorStream)
        throws IOException
    {
        assert cmdarray != null && cmdarray.length > 0;
 
        // Convert arguments to a contiguous block; it's easier to do
        // memory management in Java than in C.
        byte[][] args = new byte[cmdarray.length-1][];
        int size = args.length; // For added NUL bytes
        for (int i = 0; i < args.length; i++) {
            args[i] = cmdarray[i+1].getBytes();
            size += args[i].length;
        }
        byte[] argBlock = new byte[size];
        int i = 0;
        for (byte[] arg : args) {
            System.arraycopy(arg, 0, argBlock, i, arg.length);
            i += arg.length + 1;
            // No need to write NUL bytes explicitly
        }
 
        int[] envc = new int[1];
        byte[] envBlock = ProcessEnvironment.toEnvironmentBlock(environment, envc); 
        int[] std_fds; 
        FileInputStream  f0 = null;
        FileOutputStream f1 = null;
        FileOutputStream f2 = null;
 
        try {
            if (redirects == null) {
                std_fds = new int[] { -1, -1, -1 };
            } else {
                std_fds = new int[3];
 
                if (redirects[0] == Redirect.PIPE)
                    std_fds[0] = -1;
                else if (redirects[0] == Redirect.INHERIT)
                    std_fds[0] = 0;
                else {
                    f0 = new FileInputStream(redirects[0].file());
                    std_fds[0] = fdAccess.get(f0.getFD());
                }
 
                if (redirects[1] == Redirect.PIPE)
                    std_fds[1] = -1;
                else if (redirects[1] == Redirect.INHERIT)
                    std_fds[1] = 1;
                else {
                    f1 = new FileOutputStream(redirects[1].file(),
                                              redirects[1].append());
                    std_fds[1] = fdAccess.get(f1.getFD());
                }
 
                if (redirects[2] == Redirect.PIPE)
                    std_fds[2] = -1;
                else if (redirects[2] == Redirect.INHERIT)
                    std_fds[2] = 2;
                else {
                    f2 = new FileOutputStream(redirects[2].file(),
                                              redirects[2].append());
                    std_fds[2] = fdAccess.get(f2.getFD());
                }
            }
 
        return new UNIXProcess
            (toCString(cmdarray[0]),
             argBlock, args.length,
             envBlock, envc[0],
             toCString(dir),
                 std_fds,
             redirectErrorStream);
        } finally {
            // In theory, close() can throw IOException
            // (although it is rather unlikely to happen here)
            try { if (f0 != null) f0.close(); }
            finally {
                try { if (f1 != null) f1.close(); }
                finally { if (f2 != null) f2.close(); }
            }
        }
    }

new UNIXProcess 环境

 /**
 * java.lang.Process subclass in the UNIX environment.
 *
 * @author Mario Wolczko and Ross Knippel.
 * @author Konstantin Kladko (ported to Linux and Bsd)
 * @author Martin Buchholz
 * @author Volker Simonis (ported to AIX)
 */
final class UNIXProcess extends Process {

3. 总结

Runtime用处非常多,偏底层

比如gc调用

Java Runtime的使用方法是什么

加载jar文件

Java Runtime的使用方法是什么

Runtime功能强大,但需要合理利用,很多攻击是通过Runtime执行的漏洞

但是使用shutdownhook还是很方便的,用来做停止任务的后续处理。

关于Java Runtime的使用方法是什么就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/147373.html

(0)

相关推荐

  • 怎么使用TFserving

    技术怎么使用TFserving这篇文章主要讲解了“怎么使用TFserving”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用TFserving”吧!1.什么是TFs

    攻略 2021年11月13日
  • hot的比较级,形容词比较级双写+er的有哪些

    技术hot的比较级,形容词比较级双写+er的有哪些在重读闭音节(即:辅音+元音+辅音)中hot的比较级,要双写结尾的辅音字母,然后比较级加er,列举如下:bigger,thinner,fatter,hotter,slim

    生活 2021年10月29日
  • MySQL和Oracle中的唯一性索引的差别是怎样的

    技术MySQL和Oracle中的唯一性索引的差别是怎样的本篇文章给大家分享的是有关MySQL和Oracle中的唯一性索引的差别是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说

    攻略 2021年11月16日
  • 1063 Set Similarity (25 分),set)

    技术1063 Set Similarity (25 分),set) 1063 Set Similarity (25 分)(set)Given two sets of integers, the simi

    礼包 2021年11月27日
  • 一氧化碳化学式,一氧化碳的化学符号是什么

    技术一氧化碳化学式,一氧化碳的化学符号是什么一氧化碳是由碳和氧组成,元素符号为C何O,其化学式为CO。 在标准状态下一氧化碳是无色一氧化碳化学式、无味,有毒的气体,其相对分子质量为28,密度为1.25g/L,冰点为-20

    生活 2021年10月22日
  • 目前浏览器引擎有哪些主流的(浏览器内置引擎有哪些)

    技术浏览器的引擎有哪些本篇内容介绍了“浏览器的引擎有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!浏览器是互联网时代

    攻略 2021年12月21日