2012-02-08 50 views
0

所以我有一个字符串,我想给exec,卷曲串...当它被exec'd它屠杀我的用户代理字符串...的Runtime.exec()不表现为预期

这里是我exec'ing串...

/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 

下面是我用给exec它

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

什么期望输出 – Woot4Moo 2012-02-08 02:07:49

+0

我喜欢你的头像... – ariefbayu 2012-02-08 02:09:23

+0

应该是192.168.1.105 - - [07 /二月/ 2012:20:59:38 -0500] “GET/HTTP/1.1” 200 6791“ - “”1 2 3 4 5“ – MichaelICE 2012-02-08 02:09:37

回答

3

你对分裂的空间,和 “1 2 3 4 5” 中有空格在里面。

+0

我在空间上分开的原因,它使'输出'逃脱了,所以没有疯狂的东西可以执行......例如:www.test.com && rm -rf * – MichaelICE 2012-02-08 02:11:18

+0

@ MikeCurry好的。但这就是为什么你得到了你所得到的结果,并且输出证实了它。 – 2012-02-08 02:12:35

+0

得到这个信息从:http://stackoverflow.com/questions/5928225/how-to-make-pipes-work-with-runtime-exec – MichaelICE 2012-02-08 02:13:14

0

我建议以不同的方式分隔它。我会使用分号(;)或任何非易失性分隔符。并以这种方式分割字符串。这里要记住的是,你并不关心只有你愿意执行的内容才会传递到你的程序中。因此,你的CMDLINE变量应该是这样的:

必要

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

使用String.trim()。

+0

我如何转义特殊字符(即:& | * ;)我希望能够允许用户代理中的这些字符,但不能被解释。 – MichaelICE 2012-02-08 02:23:49

+0

你能举个例子吗?这听起来更像是你想在这种情况下使用过滤器。我可能误解了这个问题,但是你基本上收到了一个字符串,你需要避免恶意输入的正确性? – Woot4Moo 2012-02-09 01:37:06