有些时候,我们需要使用java来执行一些shell或者cmd命令,但是运行的时候可能会遇到一些问题,
比如:怎么获取返回值?怎么执行多条命令?为什么cd没有效果?
下面是我封装好的函数,可以直接使用。

函数封装

  1. package com.alvin.util;
  2. import java.io.*;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. /**
  6. * cmd工具类
  7. *
  8. * @author tianyunperfect
  9. */
  10. public class CmdUtils {
  11. /**
  12. * 执行并返回结果
  13. *
  14. * @param cmd
  15. * @return
  16. * @throws Exception
  17. */
  18. public static String execute(String cmd) throws Exception {
  19. Process process = Runtime.getRuntime().exec(cmd);
  20. //获取返回值
  21. String line;
  22. StringBuilder sb = new StringBuilder();
  23. BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(), "gbk"));
  24. while ((line = br.readLine()) != null) {
  25. System.out.println(line);
  26. sb.append(line + "\n");
  27. }
  28. br.close();
  29. return sb.toString();
  30. }
  31. /**
  32. * 批量执行cmd,并返回结果,默认当前目录
  33. * cd /home/test
  34. * pwd
  35. * rm -fr /home/proxy.log
  36. *
  37. * @param commands
  38. * @return
  39. */
  40. public static List<String> executeNewFlow(List<String> commands) throws Exception {
  41. List<String> rspList = new ArrayList<>();
  42. Runtime run = Runtime.getRuntime();
  43. Process proc = run.exec("/bin/bash", null, null);
  44. BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
  45. PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
  46. for (String line : commands) {
  47. out.println(line);
  48. }
  49. // 这个命令必须执行,否则in流不结束。
  50. out.println("exit");
  51. String rspLine;
  52. while ((rspLine = in.readLine()) != null) {
  53. System.out.println(rspLine);
  54. rspList.add(rspLine);
  55. }
  56. proc.waitFor();
  57. in.close();
  58. out.close();
  59. proc.destroy();
  60. return rspList;
  61. }
  62. }

使用

执行单个命令,例如 ipconfig

  1. execute("ipconfig")
  2. <<<<<<<<<<<<<<<< 结果
  3. Windows IP 配置
  4. 无线局域网适配器 WLAN:
  5. 连接特定的 DNS 后缀 . . . . . . . :
  6. 本地链接 IPv6 地址. . . . . . . . : fe80::d443:f28e:ed86:d018%7
  7. IPv4 地址 . . . . . . . . . . . . : 10.200.9.73
  8. 子网掩码 . . . . . . . . . . . . : 255.255.248.0
  9. 默认网关. . . . . . . . . . . . . : 10.200.8.1
  10. …………

执行多个命令

  1. ArrayList<String> strings = new ArrayList<>(Arrays.asList(
  2. "pwd", "mkdir tmp", "cd tmp", "touch tmp.txt"
  3. ));
  4. executeNewFlow(strings);
  5. <<<<<<<<<<<<<<<< 结果
  6. .
  7. └── tmp
  8. └── tmp.txt