Java调用shell脚本解决传参和权限问题的方法
作者:双斜杠少年 发布时间:2023-04-27 05:50:37
标签: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
来源:https://blog.csdn.net/u012373815/article/details/78771689


猜你喜欢
- 代理OkHttp 支持设置代理,使用OkHttpClient.proxy()即可设置。什么是代理?根据代理的对象不同,可分为正向代理和反向代
- 新手学习记录。写在springboot test 示例 示例代码地址看结尾。后面有带页面的示例。SpringBoot Test无
- spring boot 作为微服务的便捷框架,在错误页面处理上也有一些新的处理,不同于之前的spring mvc 500的页面处理是比较简单
- 给组件加上 * 定义一个类,这个类继承ActionListenerpubulic class ButListener implements
- RestTemplate加@Autowired注入不了1、在启动类加入如图箭头所示代码:然后在进行@Autowired发现不报错了。完美解决
- 本文为大家分享了Android实现带动画效果的可点击展开TextView 制作代码,效果图: 收起(默认)效果:点击展开后的效果:源码: 布
- 一.服务端代码:import java.net.*; // for Socket, ServerSocket, and InetAddres
- 1、何为依赖冲突Maven是个很好用的依赖管理工具,但是再好的东西也不是完美的。Maven的依赖机制会导致Jar包的冲突。举个例子,现在你的
- 目录文件下载文件上传 * * 的配置多个 * 的执行顺序异常处理器基于配置的异常处理基于注解的异常处理总结文件下载使用ResponseEn
- 本文实例讲述了C#实现求一组数据众数的方法。分享给大家供大家参考。具体如下:1.算法描述1)输入合法性检验(输入不能为空)2)制作数组副本,
- Java的反射机制允许我们对一个类的加载、实例化、调用方法、操作属性的时期改为在运行期进行,这大大提高了代码的灵活度。但在运行期进行反射操作
- 技术看点 WinForm自定义控件的使用自定义控件gif动画的播放需求及效果又来一波 C# GDI自定义控件show 。这个控件已
- 女朋友他们项目用了 spring-boot,以 spring-boot-parent 作为 parent:<parent> &l
- 简单使用redis-zset实现排行榜此方法实现一个根据某字段的查询次数进行排行,查询的次数越多排行越前(从大到小排序),适用于初学者1.添
- 项目最终的文件结构1 添加maven依赖 <dependency> <groupI
- 使用自定义注解实现接口限流在高并发系统中,保护系统的三种方式分别为:缓存,降级和限流。限流的目的是通过对并发访问请求进行限速或者一个时间窗口
- 本篇文章基于redisson-3.17.6版本源码进行分析一、主从redis架构中分布式锁存在的问题1、线程A从主redis中请求一个分布式
- 错误详情:java.lang.NoSuchMethodException: [Lorg.springframework.web.multip
- Java常用类包装类由于Java语言中的基本类型不是面向对象,并不具备对象的性质,实际使用存在很多不便。Java在java.lang包中提供
- 在intellij中忽略提交文件,分两种情况,文件没有纳入版本管理第一种方法文件还没有纳入版本管理,这种通过 svn的ignore配置ver