java.lang包下有一个Runtime类,是一个封装了JVM进程的类。每一个JAVA程序实际上都是启动了一个JVM进程,那么每一个进程都是对应这一个Runtime实例,其实例是由JVM为其初始化的。该类有一个方法,exec(),我们就是使用该方法来调用shell命令的。
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。
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 失败");
}
把整个命令都当成/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