使用来自Java代码的不同引号为Elasticsearch查询执行Bash一行代码

我试图在我的java代码中执行弹性搜索帖子查询。我希望使用bash shell在我的机器上执行代码。

这是我的代码:

public class Elastic {public static void main(String[] args) {String cmd = "curl -X PUT IP:PORT/twitter/_doc/10 -H 'Content-Type:
 application/json' -d '{ \"user\" : \"Bob\", \"post_date\" : \"2019-12-15T14:12:10\", \"message\" : \"trying out Elasticsearch\" }' ";


   try {Process pr = Runtime.getRuntime().exec(cmd);
  } catch (Exception e) {
    e.printStackTrace();
   }/*
   try {
    Runtime.getRuntime().exec("/bin/bash "+"-c "+"\'"+cmd+"\'");
  } catch (Exception e) {
    e.printStackTrace();
   }   */System.out.println("===============");System.out.println(cmd);
 }
 }

我已经尝试过两种不同的方式,你可以从已被注释掉的代码中看出来。

我打印我构建的查询以验证它。当我在我的本地机器上执行此程序并在终端中尝试打印的查询时,它可以工作,但不能在我的java代码/ bash查询中。我想这与格式化和单引号的使用有关,但我还没有能够直接从我的代码中运行它。


Cats萌萌
浏览 590回答 3
3回答

翻阅古今

最好的方法请参阅其他答案,了解更好的方法。如何解决这个问题这是您当前方法的正确(并且棘手)引用:String cmd = "curl -X PUT IP:PORT/twitter/_doc/10 -H '"\'"'Content-Type: application/json'"\'"' -d '"\'"'{ \"user\" : \"Bob\", \"post_date\" : \"2019-12-15T14:12:10\", \"message\" : \"trying out Elasticsearch\" }'"\'"' ";[...]Runtime.getRuntime(). exec("/bin/bash "+"-c "+"'"+cmd+"'");在单引号内传递给shell的字符串中,通过结束当前单引号('),启动双引号("),添加转义单引号(\'),关闭双引号(")并继续单引号来转义其他单引号- 引用字符串(')。放在一起,我们写这个,因为它变成'"\'"'了上下文。bli '"\'"'single-quote-inside-json'"\'"' bla/bin/bash -c 'bli '"\'"'single-quote-inside-json'"\'"' bla'为什么这么复杂?有必要的原因可以在bash(1)手册页中找到:单引号之间可能不会出现单引号,即使前面有反斜杠也是如此。这就是为什么我们必须结束单引号,启动双引号(单引号可以转义),结束双引号,并再次继续我们的单引号。

人到中年有点甜

正确分离参数和引用可能很难正确使用Runtime.exec。如果你需要传递像json这样的复杂参数,我建议你看看更强大的ProcessBuilder API。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java