一、本地执行 Linux 命令

1. 执行单条命令

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;public class ShellUtil {public void execCmd(String cmd) throws IOException {Runtime run = Runtime.getRuntime();Process proc = null;BufferedReader br = null;InputStream in = null;try {proc = run.exec(cmd, null, null);in = proc.getInputStream();br = new BufferedReader(new InputStreamReader(in));String result;while ((result = br.readLine()) != null) {System.out.println("job result [" + result + "]");}proc.waitFor();} catch (Exception e) {e.printStackTrace();} finally {if (proc != null)proc.destroy();if (in != null)in.close();if (br != null)br.close();}}}

2. 执行含有管道符(|)的多级命令

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.List;public class ShellUtil {public List<String> execCmd(String cmd) throws IOException {List<String> list = new ArrayList<>();Runtime run = Runtime.getRuntime();Process proc = null;BufferedReader br = null;InputStream in = null;try {proc = run.exec(new String[]{"/bin/sh", "-c", cmd});in = proc.getInputStream();br = new BufferedReader(new InputStreamReader(in));String result;while ((result = br.readLine()) != null) {System.out.println("job result [" + result + "]");list.add(result);}proc.waitFor();return list;} catch (Exception e) {e.printStackTrace();} finally {if (proc != null)proc.destroy();if (in != null)in.close();if (br != null)br.close();}return list;}}

3. 执行多条命令

import java.io.*;import java.util.ArrayList;import java.util.List;public class ShellUtil {/** * 命令集合 */public static List<String> getCommandList() {String path = "/root";List<String> commands = new ArrayList<>();commands.add("cd " + path);commands.add("ls");return commands;}/** * 执行命令 */public static List<String> execCommands(List<String> commands) throws IOException {List<String> list = new ArrayList<>();Runtime run = Runtime.getRuntime();Process proc = null;BufferedReader in = null;PrintWriter out = null;try {proc = run.exec("/bin/bash", null, null);in = new BufferedReader(new InputStreamReader(proc.getInputStream()));out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);// 写入执行命令for (String line : commands) {out.println(line);}// 这个命令必须执行,否则 in 流不结束out.println("exit");String line;while ((line = in.readLine()) != null) {System.out.println("readLine: " + line);list.add(line);}// 释放资源proc.waitFor();} catch (Exception e) {e.printStackTrace();} finally {if (proc != null)proc.destroy();if (in != null)in.close();if (out != null)out.close();}return list;}}

二、远程执行 Linux 命令

<dependency><groupId>ch.ethz.ganymed</groupId><artifactId>ganymed-ssh2</artifactId><version>262</version></dependency>
import ch.ethz.ssh2.Connection;import ch.ethz.ssh2.Session;import ch.ethz.ssh2.StreamGobbler;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;public class LinuxUtil {public static void main(String[] args) {String hostname = "127.0.0.1";String username = "root";String password = "123456";try {Connection conn = new Connection(hostname);conn.connect();boolean isAuthenticated = conn.authenticateWithPassword(username, password);if (!isAuthenticated) {throw new IOException("Authentication failed");}Session sess = conn.openSession();// 命令语句,必须使用绝对路径否则无效(环境变量也不可以)。如:java --versionsess.execCommand("pwd");InputStream stdout = new StreamGobbler(sess.getStdout());BufferedReader br = new BufferedReader(new InputStreamReader(stdout));while (true) {String line = br.readLine();if (line == null) {break;}// 输出命令执行结果System.out.println(line);}sess.close();conn.close();} catch (IOException e) {e.printStackTrace(System.err);System.exit(2);}}}