Java代码调用本地shell命令或shell脚本

1. 概述:

java.lang包下有一个Runtime类,是一个封装了JVM进程的类。每一个JAVA程序实际上都是启动了一个JVM进程,那么每一个进程都是对应这一个Runtime实例,其实例是由JVM为其初始化的。该类有一个方法,exec(),我们就是使用该方法来调用shell命令的。

2. exec方法的说明:

Runtime.getRuntime().exec()方法主要用于执行外部的程序或命令。
Runtime.getRuntime().exec共有六个重载方法:
1.public Process exec(String command)
在单独的进程中执行指定的字符串命令。
2.public Process exec(String [] cmdArray)
在单独的进程中执行指定命令和变量
3.public Process exec(String command, String [] envp)
在指定环境的独立进程中执行指定命令和变量
4.public Process exec(String [] cmdArray, String [] envp)
在指定环境的独立进程中执行指定的命令和变量
5.public Process exec(String command,String[] envp,File dir)
在有指定环境和工作目录的独立进程中执行指定的字符串命令
6.public Process exec(String[] cmdarray,String[] envp,File dir)
在指定环境和工作目录的独立进程中执行指定的命令和变量

参数说明:
cmdarray - 包含所调用命令及其参数的数组。
envp - 字符串数组,其中每个元素的环境变量的设置格式为 name=value,如果子进程应该继承当前进程的环境,或该参数为 null。
dir - 子进程的工作目录;如果子进程应该继承当前进程的工作目录,则该参数为 null。

 

3. exec(String command)与exec(String[] cmdArray)

exec(String command)有很大的局限性,不能执行重定向或者管道命令

        String cmd = "lsof -i:8080 >>/home/user/log.log";
        String[] cmds = new String[]{
                "/bin/bash",
                "-c",
                "lsof -i:8080 >> /home/user/log.log"
        };
        BufferedReader br = null;
        try {
            Process p = Runtime.getRuntime().exec(cmd);
            br = new BufferedReader(new InputStreamReader(p.getInputStream()));
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }
            System.out.println("sb:" + sb.toString());

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            throw new ServiceLevelException(ExceptionConstants.SYSTEM_EXCEPTION, "test 失败");
        } 

4. 如何使用exec(String[] cmdArray)

把整个命令都当成/bin/bash的参数传入

假设我需要执行/home/user/script ,并且调用这个script脚本的时候需要给他传三个参数,分别是param1,param2,param3.这里就应该这么写:

	cmds = new String[]{
                "/bin/sh",
                "-c",
                "/home/user/script param1 param2 param3"
        };

或者:

	cmds = new String[]{
                "/home/user/script",
                "param1",
                "param2",
                "param3"
        };

假设这个脚本还需要sudo权限,user的密码是123456 ,则更复杂一点:

	cmds = new String[]{
                "/bin/sh",
                "-c",
                "echo 123456| sudo -S /home/user/script param1 param2 param3"
        };

这里无论 我们在shell界面运行“/home/user/script param1 param2 param3”还是“echo 123456| sudo -S /home/user/script param1 param2 param3”都应该可以运行才对。

 

参考文章:

https://www.cnblogs.com/softidea/p/4287519.html

https://www.linuxidc.com/Linux/2012-07/64526.htm

http://blog.51cto.com/tianxingzhe/1700098

https://blog.csdn.net/timo1160139211/article/details/75006938

你可能感兴趣的:(Java,Linux)