Ausführen eines Shell-Befehls von Java aus
In Java können wirProcessBuilder
oderRuntime.getRuntime().exec
verwenden, um einen externen Shell-Befehl auszuführen:
1. ProcessBuilder
ProcessBuilder processBuilder = new ProcessBuilder(); // -- Linux -- // Run a shell command processBuilder.command("bash", "-c", "ls /home/example/"); // Run a shell script //processBuilder.command("path/to/hello.sh"); // -- Windows -- // Run a command //processBuilder.command("cmd.exe", "/c", "dir C:\\Users\\example"); // Run a bat file //processBuilder.command("C:\\Users\\example\\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/example/"); // 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\\example"); //Run a bat file Process process = Runtime.getRuntime().exec( "cmd /c hello.bat", null, new File("C:\\Users\\example\\")); 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-Beispiel
Ein Beispiel, um einenping
-Befehl auszuführen und seine Ausgabe auszudrucken.
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(); } } }
Ausgabe
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
Note
Mehr JavaProcessBuilder
examples
4. HOST Beispiel
Beispiel zum Ausführen des Shell-Befehlshost -t a google.com
, um alle an google.com angehängten IP-Adressen abzurufen. Später verwenden wir reguläre Ausdrücke, um alle IP-Adressen abzurufen und anzuzeigen.
P.S “host” command is available in *nix system only.
ExecuteShellComand.java
package com.example.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; } }
Ausgabe
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