java调用shell命令并返回执行结果

Java调用shell脚本或命令时,可使用下面的两种方式:

1、Runtime.getRuntime().exec();

2、通过ProcessBuilder进行调度。

第一种方式比较直接,具体使用方式见https://blog.csdn.net/arkblue/article/details/7897396

由于在使用过程中,涉及到shell命令的字符串和数组形式,以及权限问题、同时调用多条shell命令等,这时候第二种方式就比较好用了,具体使用方式和代码如下:

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        Test test = new Test();
        test.callShellCommand(new String[] { "ipconfig" }, null);
        
        // 命令中有多个部分时,把命令中的每个部分写成以逗号分隔的字符串形式
//        test.callShellCommand(new String[] { "part1", "part2", "part3", ...}, null);
        
        // 可以使用下面的这种方式,直接执行一整条shell命令,或将shell命令的多个部分合成一条命令后执行
//        test.callShellCommand(new String[] { "/bin/sh", "-c", "shellCommand"}, null);
//        test.callShellCommand(new String[] { "/bin/sh", "-c", "part1" + "part2" + "part3", ...}, null);
        
        // 涉及到权限问题时,需要输入root密码
//        test.callShellCommand(new String[] { "/bin/sh", "-c", "echo " + "rootPassword" + "|sudo -S " + "shellCommand"}, null);
        
    }

    /**
     * Java调用shell命令,返回执行结果
     * @param cmdarray 包含所调用命令及其参数的数组
     * @param dir 子进程的工作目录;如果子进程应该继承当前进程的工作目录,则该参数为 null
     * @return 执行结果List
     */
    public List callShellCommand(String[] cmdarray, String dir) {
        List processList = new ArrayList();

        ProcessBuilder pb = new ProcessBuilder(cmdarray);
        // Sets this process builder's working directory
        if (dir == null) {
            pb.directory(null);
        } else {
            pb.directory(new File(dir));
        }

        try {
            Process process = pb.start();
            BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
            try {
                String line = "";
                while ((line = input.readLine()) != null) {
                    processList.add(line);
                }
            } finally {
                input.close();
                process.destroy();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        for (String line : processList) {
            System.out.println(line);
        }
        return processList;
    }

}

另外,Java调用shell命令具体实现可参考:

https://www.jb51.net/article/206163.htm

https://www.jb51.net/article/188603.htm

https://www.jb51.net/article/189643.htm

你可能感兴趣的:(Java学习,shell,java,字符串,数组,linux)