java shell 传参数_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();

}

}

源码位置:

总结

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值