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
List
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