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

 更新时间:2019年03月14日 10:12:31   作者:双斜杠少年   我要评论

今天小编就为大家分享一篇关于Java调用shell脚本解决传参和权限问题的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

1. java 执行shell

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

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

 /**
   * 执行shell
   * @param execCmd 使用命令 或 脚本标志位
   * @param para 传入参数
   */
  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 脚本是没有执行权限的。
  • 解决:在执行脚本之前,先赋予脚本执行权限。

完整的代码如下

 /**
   * 解决了 参数中包含 空格和脚本没有执行权限的问题
   * @param scriptPath 脚本路径
   * @param para 参数数组
   */
  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

总结

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

相关文章

  • 基于NIO的Netty网络框架(详解)

    基于NIO的Netty网络框架(详解)

    下面小编就为大家带来一篇基于NIO的Netty网络框架(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • java 中 zookeeper简单使用

    java 中 zookeeper简单使用

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。下面通过本文给大家分享java 中 zookeeper简单使用,需要的朋友参考下吧
    2017-09-09
  • springboot+EHcache 实现文章浏览量的缓存和超时更新

    springboot+EHcache 实现文章浏览量的缓存和超时更新

    这篇文章主要介绍了springboot+EHcache 实现文章浏览量的缓存和超时更新,问题描述和解决思路给大家介绍的非常详细,需要的朋友可以参考下
    2017-04-04
  • Struts2 文件上传进度条的实现实例代码

    Struts2 文件上传进度条的实现实例代码

    本篇文章主要介绍了Struts2 文件上传进度条的实现实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Java使用ffmpeg和mencoder实现视频转码

    Java使用ffmpeg和mencoder实现视频转码

    这篇文章主要为大家详细介绍了Java使用ffmpeg和mencoder实现视频转码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • 统一建模语言_动力节点Java学院整理

    统一建模语言_动力节点Java学院整理

    这篇文章主要介绍了统一建模语言的相关知识,非常不错,具有参考借鉴价值,需要的的朋友参考下吧
    2017-06-06
  • Spring Boot集成Swagger2项目实战

    Spring Boot集成Swagger2项目实战

    在日常的工作中,我们往往需要给前端(WEB端、IOS、Android)或者第三方提供接口,这个时候我们就需要给他们提供一份详细的API说明文档。这篇文章我们就来分享一种API文档维护的方式,即通过Swagger来自动生成Restuful API文档
    2018-01-01
  • java使用influxDB数据库的详细代码

    java使用influxDB数据库的详细代码

    这篇文章主要为大家介绍了java使用influxDB数据库的详细代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • Java String字符串和Unicode字符相互转换代码详解

    Java String字符串和Unicode字符相互转换代码详解

    这篇文章主要介绍了Java String字符串和Unicode字符相互转换代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • IntelliJ IDEA中查看文件内所有已声明的方法(类似eclipse的outline)

    IntelliJ IDEA中查看文件内所有已声明的方法(类似eclipse的outli

    今天小编就为大家分享一篇关于IntelliJ IDEA中查看文件内所有已声明的方法(类似eclipse的outline),小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10

最新评论