java - 在Java中生成带有参数的linux命令
问题描述
我正在寻找一个库(Java/Scala),它给出一个命令,一个参数列表会产生一个String
,如果粘贴到 bash 终端中,它将执行给定命令及其所有参数(正确转义)。
我知道java.lang.ProcessBuilder
阶级。如果我想将命令作为子进程执行,它会很好地工作。我正在寻找的是一个可以生成命令的字符串表示形式的库。
解决方案
我通常不会建议人们尝试编写自己的转义符,但在这种情况下,这并不可怕,因为 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 需要就字符编码达成一致。
推荐阅读
- scala - Spark Tesseract UnsatisfiedLinkError
- pyspark - pySpark 更新日期时间戳而不转换为本地时间
- macos - 如何防止 brew 安装 curl 包?
- javascript - 缩小供应商捆绑包中的增量 dom 时的 webpack 问题
- karate - 如何在 KARATE DSL 中断言可以为 null(Porp:null) 或具有子模式的 json 属性(Porp:{ denyAny: '#boolean', assertions: '#[]' })?
- python-3.x - 调用函数重新实例化类
- shell - 期望与 <
我想要一个自动 su 脚本,但希望与 <
该脚本正常工作
#!/usr/bin/expect set timeout 5 spawn su expect "Password:" send "123456\r" interact #expect "# " #send "whoami"
- ssh - 在 Compute Engine 上使用 Ubuntu 18.04 端口 80 停止响应
- android - Android Firestore 切换按钮使用按钮选择器恢复为 false 状态
- google-apps-script - 根据谷歌表格中的日期获取电子邮件详细信息