首页 > 解决方案 > 在Java中生成带有参数的linux命令

问题描述

我正在寻找一个库(Java/Scala),它给出一个命令,一个参数列表会产生一个String,如果粘贴到 bash 终端中,它将执行给定命令及其所有参数(正确转义)。

我知道java.lang.ProcessBuilder阶级。如果我想将命令作为子进程执行,它会很好地工作。我正在寻找的是一个可以生成命令的字符串表示形式的库。

标签: javalinuxbashscalaprocess

解决方案


我通常不会建议人们尝试编写自己的转义符,但在这种情况下,这并不可怕,因为 bash 单引号字符串将正确地包含除 NUL 字节和嵌套单引号之外的每个字符:

  public static String bashEscape(String[] arguments) {
    StringBuilder sb = new StringBuilder();
    for(String arg : arguments) {
      if (arg.indexOf(0) != -1) {
        throw new IllegalArgumentException("Shell arguments can't represent NUL bytes");
      }
      sb.append("'").append(arg.replaceAll("'", "'\\\\''")).append("' ");
    }
    return sb.toString();
  }

这正确地转义:

  • 所有类型的引用,包括单引号、双引号、反引号和反斜杠
  • 所有形式的 shell 元字符,如*?![]()|<>&;$和空格
  • 显然,所有常规字母数字字符
  • 换行、退格和其他控制字符

唯一需要注意的是,当您将字符串交给它时,您和您的 shell 需要就字符编码达成一致。


推荐阅读