Runtime.exec()的行为不符合预期

时间:2012-02-08 02:06:45

标签: java shell exec

所以我有一个我想要执行的字符串,一个卷曲字符串...当它被执行时,它正在屠杀我的用户代理字符串......

这是我执行的字符串...

/usr/bin/curl  -L --no-keepalive --max-time 30 --connect-timeout 30 --insecure --max-redirs 10 --stderr /var/folders/+j/+jqu+V1eEoSalBbXTff74U+++TI/-Tmp-/output7756019899402490058.tmp --cookie-jar /var/folders/+j/+jqu+V1eEoSalBbXTff74U+++TI/-Tmp-/cookies4551380191209065239.tmp --user-agent "1 2 3 4 5" --dump-header /var/folders/+j/+jqu+V1eEoSalBbXTff74U+++TI/-Tmp-/headers159122813500476027.tmp http://test.com

这是我用来执行它的代码

Process pr = null;
Runtime run = Runtime.getRuntime();
try {
    pr = run.exec(cmdline.split(" "));

    A ret = f.f(pr);

    pr.waitFor();

    return ret;
} catch (Exception ex) {
    throw new RuntimeException("Executing " + cmdline, ex);
} finally {
    try {
        // close all those bloody streams
        pr.getErrorStream().close();
        pr.getInputStream().close();
        pr.getOutputStream().close();
    } catch (IOException ex) {
        Log.get().exception(Log.Level.Error, "Closing stream: ", ex);
    }
}

以下是用户代理混乱的apache日志...

192.168.1.105 - - [07/Feb/2012:20:59:38 -0500] "GET / HTTP/1.1" 200 6791 "-" "\"1"

apache中的预期结果应该显示完整的用户代理(在这种情况下为1 2 3 4 5)

192.168.1.105 - - [07/Feb/2012:20:59:38 -0500] "GET / HTTP/1.1" 200 6791 "-" "1 2 3 4 5"

2 个答案:

答案 0 :(得分:3)

你在空格上分裂,“1 2 3 4 5”中有空格。

答案 1 :(得分:0)

我建议以不同的分隔方式传递它。我会使用分号(;)或任何非易失性分隔符。并以那种方式拆分字符串。这里需要记住的是,你不关心只有你愿意执行的内容才会传递给你的程序。因此,您的cmdLine变量应如下所示:

--user-agent; "1 2 3 4 5"; --dump-header;

根据需要使用String.trim()。