欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-26 14:05:34
1. java 执行shell java 通过 runtime.getruntime().exec() 方法执行 shell 的命令或 脚本,exec()方法的参数可以是...

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

参考:

总结

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