В Java мы можем использовать ProcessBuilder
или Runtime.getRuntime().exec
для выполнения команды внешней оболочки:
1. Конструктор процессов
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. Время выполнения.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
и распечатки ее вывода.
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
4. Пример ХОСТА
Пример выполнения команды оболочки host -t a google.com
чтобы получить все IP-адреса, которые подключены к google.com . Позже мы используем регулярное выражение, чтобы захватить все IP-адреса и отобразить их.
P.S Команда “хост” доступна только в системе *nix.
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); Listlist = 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 getIpAddress(String msg) { List ipList = new ArrayList (); if (msg == null || msg.equals("")) return ipList; matcher = pattern.matcher(msg); while (matcher.find()) { ipList.add(matcher.group(0)); } return ipList; } }
Выход
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
Рекомендации
- Дополнительные примеры построителя процессов
- Java doc – построитель процессов
- Java doc – Время выполнения.getRuntime().exec
- Как Проверить IP-Адрес С Помощью Регулярного Выражения
Оригинал: “https://mkyong.com/java/how-to-execute-shell-command-from-java/”