如何在执行前获取ProcessBuilder命令

9

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

      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" }'
基本上,我需要打印由ProcessBuilder对象处理的cmd数组,以在star方法执行之前查看它。

System.out.println(Arrays.toString(cmd)) .. 这会告诉你即将运行的命令是什么。 - FreudianSlip
4
该命令的输出与 pb.command().toString() 相同,即由逗号分隔的字符串数组元素。 - Juan Enrique Riquelme
不需要这样使用curl - 您可以轻松地使用Jersey进行POST而无需使用外部进程。 - Gyro Gearless
请您能否再详细解释一下这个问题? - Juan Enrique Riquelme
相应的代码在 ProcessImpl.createCommandLine 中。遗憾的是,它是私有的。可能可以复制相应的代码,或者添加断点进行调试。 - Eric Duminil
2个回答

2

我用这段代码取得了成功:

ProcessBuilder pb = new ProcessBuilder(command);    
logger.debug(String.join(" ",pb.command().toArray(new String[0])));

-3

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

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();
}

它将使用引号正确地包围包含空格的参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接