【问题标题】:How to get processbuilder command before execution如何在执行前获取processbuilder命令
【发布时间】:2017-10-17 20:58:46
【问题描述】:

我想知道在它发生之前将要执行的命令。

      String cmd[] = {"curl",
            "-X",
            "POST",
            "https://api.renam.cl/medicion/insert?access-token={Yoq3UGQqDKP4D1L3Y6xIYp-Lb6fyvavpF3Lm-8cD}",
            "-H",
            "content-type: application/json",
            "-d",
            json.toString()};

        ProcessBuilder pb = new ProcessBuilder(cmd);

        Log.debug("COMANDO.TOSTRING " + pb.command().toString());

        Process p = pb.start();

        Log.debug(p.getOutputStream().toString());

        p.waitFor();

        BufferedReader reader
                = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String readline;

        while ((readline = reader.readLine()) != null) {
            Log.debug(readline);
        }

使用 readline 我有服务器应答输出,但我不知道如何获取我使用 processbuilder 执行的 curl 命令。

编辑 1:

我只需要使用 linux 控制台发送这个命令:

curl -X POST 'https://api.com/data/insert?access-token=Yoq3UGQqDKP4D1L3Y6xIYp-Lb6fyvavpF3Lm-8cD' -H 'content-type: application/json' -d '{ "pm25":2, "timestamp":1495077872, "dispositivo_mac": "12:34:56: 78:90:12" }'

基本上我需要在star方法执行前打印ProcessBuilder对象处理的cmd数组才能看到。

【问题讨论】:

  • System.out.println(Arrays.toString(cmd)) .. 这会告诉你你将要运行什么命令。
  • 该命令的打印结果与 pb.command().toString() 相同,只是用逗号分隔的字符串数组元素
  • 无需以这种方式使用 curl - 您可以轻松地使用例如泽西岛,无需使用外部进程。
  • 你能解释一下吗?
  • 对应的代码在ProcessImpl.createCommandLine。可悲的是,它是私人的。可能可以复制相应的代码,或者添加断点并进行调试。

标签: java linux curl processbuilder


【解决方案1】:

这是打印可运行命令的代码:

private String getRunnableCommand(ProcessBuilder processBuilder)
{
    List<String> commandsList = processBuilder.command();
    StringBuilder runnableCommandBuilder = new StringBuilder();
    int commandIndex = 0;
    for (String command : commandsList)
    {
        if (command.contains(" "))
        {
            runnableCommandBuilder.append("\"");
        }
        runnableCommandBuilder.append(command);

        if (command.contains(" "))
        {
            runnableCommandBuilder.append("\"");
        }

        if (commandIndex != commandsList.size() - 1)
        {
            runnableCommandBuilder.append(" ");
        }

        commandIndex++;
    }
    return runnableCommandBuilder.toString();
}

它将用引号正确地将包含空格的参数括起来。

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 2012-03-11
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 2017-05-27
    • 2019-04-21
    相关资源
    最近更新 更多