在java程序中发送shell命令

时间:2016-03-01 23:50:55

标签: java shell

我试图在java程序中执行以下shell命令:

 curl -k -X POST -H "Content-Type:application/json" -d '{"COMMAND":"DISCSTATUS","USER":"PMDC"}' 
 https://167.254.226.215/DcnWebSvr/DcnSvrCmd

返回字符串

 {"Result":"SUCCESS"}

从终端,这个命令工作正常。但是,当我尝试从java程序中执行此操作时,我得不到相同的结果。

这是我的代码:

 StringBuffer output = new StringBuffer();
    ProcessBuilder builder = new ProcessBuilder("curl","-k", "-X", "POST","- H","\"Content-Type:application/json\"",
                                                "-d","'{\"COMMAND\":\"DISCSTATUS\",\"USER\":\"PMDC\"}'", 
                                                "https://167.254.226.215/DcnWebSvr/DcnSvrCmd");
    builder.redirectErrorStream(true);
    try {

        Process process = builder.start();
        InputStream is = process.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));

        String line = null;
        while ((line = reader.readLine()) != null) {
            output.append(line + "\n");

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return output.toString();

但是,它没有输出正确的字符串。相反,它似乎将命令识别为某种转移,因为这是我得到的输出:

   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                  Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100    40    0     0  100    40      0    164 --:--:-- --:--:-- --:--:--   165

我只是忽略了一些语法错误吗?我错过了什么?

3 个答案:

答案 0 :(得分:1)

您希望使用curl --silent来取消进度信息。

答案 1 :(得分:0)

解决了我的问题。问题是我使用的是单引号,而我在ProcessBuilder中并不需要它们。与此相同:

Execute curl from java with processbuilder

答案 2 :(得分:-1)

这是由于误解了命令解释器(例如shell)如何处理命令行与如何在进程中启动它。

ProcessBuilder需要原始参数。

从shell开始,请考虑一下:

# Both commands will be the same
ls
"ls"

是的,这是一回事。报价实际上由THE SHELL解释。但是幕后的真实过程只能看到shell事先处理过的东西 - 在这种情况下,只是一个简单的ls

在你的shell中试试;你会发现所有这些都有相同的结果:

'l's
'ls'
'l'"s"
'l''s'

尝试查看对ProcessBuilder的参数意味着什么...我所说的不仅与命令相关,而且与所有参数有关...