在Java中,我们可以使用ProcessBuilder
或Runtime.getRuntime().exec
来执行外部shell命令:
1. ProcessBuilder
ProcessBuilder processBuilder = new ProcessBuilder();
// -- Linux --
// Run a shell command
processBuilder.command("bash", "-c", "ls /home/mkyong/");
// Run a shell script
//processBuilder.command("path/to/hello.sh");
// -- Windows --
// Run a command
//processBuilder.command("cmd.exe", "/c", "dir C:\\Users\\mkyong");
// Run a bat file
//processBuilder.command("C:\\Users\\mkyong\\hello.bat");
try {
Process process = processBuilder.start();
StringBuilder output = new StringBuilder();
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
output.append(line + "\n");
}
int exitVal = process.waitFor();
if (exitVal == 0) {
System.out.println("Success!");
System.out.println(output);
System.exit(0);
} else {
//abnormal...
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
2. Runtime.getRuntime()。exec()
try {
// -- Linux --
// Run a shell command
// Process process = Runtime.getRuntime().exec("ls /home/mkyong/");
// Run a shell script
// Process process = Runtime.getRuntime().exec("path/to/hello.sh");
// -- Windows --
// Run a command
//Process process = Runtime.getRuntime().exec("cmd /c dir C:\\Users\\mkyong");
//Run a bat file
Process process = Runtime.getRuntime().exec(
"cmd /c hello.bat", null, new File("C:\\Users\\mkyong\\"));
StringBuilder output = new StringBuilder();
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
output.append(line + "\n");
}
int exitVal = process.waitFor();
if (exitVal == 0) {
System.out.println("Success!");
System.out.println(output);
System.exit(0);
} else {
//abnormal...
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
3. PING示例
一个执行ping
命令并输出其输出的示例。
ProcessBuilderExample1.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ProcessBuilderExample1 {
public static void main(String[] args) {
ProcessBuilder processBuilder = new ProcessBuilder();
// Windows
processBuilder.command("cmd.exe", "/c", "ping -n 3 google.com");
try {
Process process = processBuilder.start();
BufferedReader reader =
new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
int exitCode = process.waitFor();
System.out.println("\nExited with error code : " + exitCode);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
输出量
Pinging google.com [172.217.31.78] with 32 bytes of data:
Reply from 172.217.31.78: bytes=32 time=13ms TTL=55
Reply from 172.217.31.78: bytes=32 time=7ms TTL=55
Reply from 172.217.31.78: bytes=32 time=6ms TTL=55
Ping statistics for 172.217.31.78:
Packets: Sent = 3, Received = 3, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 6ms, Maximum = 13ms, Average = 8ms
Exited with error code : 0
注意
更多Java ProcessBuilder示例
4.主机示例
执行shell命令host -ta google.com
以获取附加到google.com的所有IP地址的示例。 稍后,我们使用正则表达式来获取所有IP地址并显示它。
PS“主机”命令仅在* nix系统中可用。
ExecuteShellComand.java
package com.mkyong.shell;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ExecuteShellComand {
private static final String IPADDRESS_PATTERN = "([01]?\\d\\d?|2[0-4]\\d|25[0-5])"
+ "\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])"
+ "\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])"
+ "\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])";
private static Pattern pattern = Pattern.compile(IPADDRESS_PATTERN);
private static Matcher matcher;
public static void main(String[] args) {
ExecuteShellComand obj = new ExecuteShellComand();
String domainName = "google.com";
String command = "host -t a " + domainName;
String output = obj.executeCommand(command);
//System.out.println(output);
List<string> list = obj.getIpAddress(output);
if (list.size() > 0) {
System.out.printf("%s has address : %n", domainName);
for (String ip : list) {
System.out.println(ip);
}
} else {
System.out.printf("%s has NO address. %n", domainName);
}
}
private String executeCommand(String command) {
StringBuffer output = new StringBuffer();
Process p;
try {
p = Runtime.getRuntime().exec(command);
p.waitFor();
BufferedReader reader =
new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = reader.readLine())!= null) {
output.append(line + "\n");
}
} catch (Exception e) {
e.printStackTrace();
}
return output.toString();
}
public List<string> getIpAddress(String msg) {
List<string> ipList = new ArrayList<string>();
if (msg == null || msg.equals(""))
return ipList;
matcher = pattern.matcher(msg);
while (matcher.find()) {
ipList.add(matcher.group(0));
}
return ipList;
}
}
</string></string></string></string>
输出量
google.com has address :
74.125.135.x
74.125.135.x
74.125.135.x
74.125.135.x
74.125.135.x
74.125.135.x
参考文献
翻译自: https://mkyong.com/java/how-to-execute-shell-command-from-java/