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
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接
相关文章
迅速学会@ConfigurationProperties的使用操作
这篇文章主要介绍了迅速学会@ConfigurationProperties的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-10-10
SpringBoot处理form-data表单接收对象数组的方法
form-data则是一种更加灵活的编码方式,它可以处理二进制数据(如图片、文件等)以及文本数据,这篇文章主要介绍了SpringBoot处理form-data表单接收对象数组,需要的朋友可以参考下2023-11-11
SpringBoot 接口开发教程(httpclient客户端)
这篇文章主要介绍了SpringBoot 接口开发教程(httpclient客户端),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-03-03
SpringBoot如何使用MyBatisPlus逆向工程自动生成代码
本文介绍如何使用SpringBoot、MyBatis-Plus进行逆向工程自动生成代码,并结合Swagger3.0实现API文档的自动生成和访问,通过详细步骤和配置,确保Swagger与SpringBoot版本兼容,并通过配置文件和测试类实现代码生成和Swagger文档的访问2024-12-12
Spring JdbcTemplate整合使用方法及原理详解
这篇文章主要介绍了Spring JdbcTemplate整合使用方法及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2020-08-08


最新评论