java - 在 Java 中生成带参数的 linux 命令

标签 java linux bash scala process

<分区>

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

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

最佳答案

我通常不会建议人们尝试编写自己的转义器,但在这种情况下这并不可怕,因为 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 需要就字符编码达成一致。

关于java - 在 Java 中生成带参数的 linux 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54930862/

相关文章:

java - android中基于文件的文档存储

java - 从数据库中提取时间并在该特定时间发送消息

linux - 如何从 Linux 发送文件到电子邮件?

收集实体的 Java Stream

java - XSLT 参数不起作用

linux - 须藤: psql: command not found: can't fix it

linux - Bash No such file or directory 错误

bash - 无法将 perl 脚本的输出重定向到文件

linux - 如何从管道中使用两次 STDIN

linux - 如何根据条件查找文件