栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java调用shell脚本解决传参和权限问题的方法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java调用shell脚本解决传参和权限问题的方法

1. java 执行shell

java 通过 Runtime.getRuntime().exec() 方法执行 shell 的命令或 脚本,exec()方法的参数可以是脚本的路径也可以是直接的 shell命令

代码如下(此代码是存在问题的。完整代码请看2):

 
  private static void execShell(boolean execCmd, String... para) {
    StringBuffer paras = new StringBuffer();
    Arrays.stream(para).forEach(x -> paras.append(x).append(" "));
    try {
      String cmd = "", shpath = "";
      if (execCmd) {
 // 命令模式
 shpath = "echo";
      } else {
      //脚本路径
 shpath = "/Users/yangyibo/Desktop/callShell.sh";
      }
      cmd = shpath + " " + paras.toString();
      Process ps = Runtime.getRuntime().exec(cmd);
      ps.waitFor();
      BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
      StringBuffer sb = new StringBuffer();
      String line;
      while ((line = br.readLine()) != null) {
 sb.append(line).append("n");
      }
      String result = sb.toString();
      System.out.println(result);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

2. 遇到的问题和解决

  • 传参问题,当传递的参数字符串中包含空格时,上边的方法会把参数截断,默认为参数只到空格处。
  • 解决:将shell 命令或脚本 和参数 放在一个 数组中,然后将数组传入exec()方法中。
  • 权限问题,当我们用 this.getClass().getResource("/callShell.sh").getPath() 获取脚本位置的时候取的 target 下的shell脚本,这时候 shell 脚本是没有执行权限的。
  • 解决:在执行脚本之前,先赋予脚本执行权限。

完整的代码如下

 
  private void execShell(String scriptPath, String ... para) {
    try {
      String[] cmd = new String[]{scriptPath};
      //为了解决参数中包含空格
      cmd=ArrayUtils.addAll(cmd,para);
      //解决脚本没有执行权限
      ProcessBuilder builder = new ProcessBuilder("/bin/chmod", "755",scriptPath);
      Process process = builder.start();
      process.waitFor();
      Process ps = Runtime.getRuntime().exec(cmd);
      ps.waitFor();
      BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
      StringBuffer sb = new StringBuffer();
      String line;
      while ((line = br.readLine()) != null) {
 sb.append(line).append("n");
      }
      //执行结果
      String result = sb.toString();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

源码位置:

https://github.com/527515025/JavaTest/tree/master/src/main/java/com/us/callShell

参考://www.jb51.net/article/61529.htm

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对考高分网的支持。如果你想了解更多相关内容请查看下面相关链接

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/138760.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号