【问题标题】:Sending a shell command in java program在java程序中发送shell命令
【发布时间】:2016-03-02 08:46:59
【问题描述】:

我正在尝试在 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

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

【问题讨论】:

    标签: java shell


    【解决方案1】:

    您想使用curl --silent 来隐藏进度信息。

    【讨论】:

      【解决方案2】:

      解决了我的问题。问题是我在 ProcessBuilder 中使用了不需要它们的单引号。和这里一样:

      Execute curl from java with processbuilder

      【讨论】:

        【解决方案3】:

        这是由于对您的命令解释器(例如 shell)如何处理命令行而不是在进程中启动它的方式存在误解。

        ProcessBuilder 需要原始参数。

        仅从外壳来看,考虑一下:

        # Both commands will be the same
        ls
        "ls"
        

        是的,那是一回事。引号实际上是由 THE SHELL 解释的。但是幕后的真正过程只会看到 shell 事先处理的内容——在这种情况下,是一个简单的ls

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

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

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

        【讨论】:

        • 反对者请解释。这正是这里遇到的问题。
        猜你喜欢
        • 2011-02-22
        • 1970-01-01
        • 1970-01-01
        • 2021-07-07
        • 2010-11-14
        • 2010-11-05
        • 2013-04-02
        • 2020-09-29
        • 2012-05-22
        相关资源
        最近更新 更多