温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java中怎么调用shell脚本解决传参和权限问题

发布时间:2021-06-09 18:05:37 来源:亿速云 阅读:639 作者:Leah 栏目:编程语言

本篇文章给大家分享的是有关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();     }   }

以上就是Java中怎么调用shell脚本解决传参和权限问题,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI