问题描述:
Java中调用shell脚本传参后参数,部分参数被改变问题,由于参数中带有账号密码,密码参数中带有!
。
原因分析:
!
在许多 shell 环境中是一个特殊字符(通常用于历史替换)。直接传递这样的参数可能会导致意外行为。为了确保参数正确传递,需要对这些参数进行适当的转义。
解决方案:
将参数作为字符串传,就不会被解析了
- 原代码
List<String> args = Arrays.asList("admin", "0abc!123", "测试用");
ProcessBuilder processBuilder = new ProcessBuilder("test");
processBuilder.command().addAll(args);
Process process = processBuilder.start();
InputStream inputStream = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
log.info("脚本输出: " + line);
}
- 修改后:
// 调用脚本
StringBuilder cmdBuilder = new StringBuilder("test");
cmdBuilder.append(this.getShellBlank("admin"))
// 添加单引号
.append(this.getShellString("0abc!123"))
.append(this.getShellBlank("测试用"));
// test admin '0abc!123' 测试用
List<String> command = new ArrayList<>();
command.add(commandServiceImpl.getcmdJson());
command.add(cmdBuilder.toString());
ProcessBuilder processBuilder = new ProcessBuilder(command);
Process process = processBuilder.start();
private String getShellString(String param){
StringBuilder temp = new StringBuilder();
return temp.append(" '").append(param.replace("'", "'\"'\"'")).append("'").toString();
}
private String getShellBlank(String param){
StringBuilder temp = new StringBuilder();
return temp.append(" ").append(param).toString();
}
可以确保在使用 ProcessBuilder 传递包含 ! 的参数时不会遇到问题。