【问题标题】:Runtime.exec() not behaving as expectedRuntime.exec() 未按预期运行
【发布时间】:2012-02-08 02:06:44
【问题描述】:

所以我有一个我想要执行的字符串,一个 curl 字符串……当它被执行时,它正在扼杀我的用户代理字符串……

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

/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"

【问题讨论】:

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

标签: java shell exec


【解决方案1】:

您在空格上进行拆分,并且“1 2 3 4 5”中有空格。

【讨论】:

  • 我拆分空格的原因,它是为了“转义”输出,因此不会执行任何疯狂的东西......即:www.test.com && rm -rf *
  • @MikeCurry 好的。但这就是为什么你得到你所得到的,并且输出证实了这一点。
  • @MikeCurry 好的。但是您在空格上进行拆分,并且“1 2 3 4 5”中有空格。您不能将单个参数放入多个数组位置并期望它起作用。
  • 嗯,我应该确保在这样的事情上不会执行破坏性字符吗? (即 * \ / & ~ )等
【解决方案2】:

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

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

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

【讨论】:

  • 如何转义特殊字符(即:& | * ;)我希望能够在用户代理中允许这些字符,但不被解释。
  • 你能举个例子吗?这听起来更像是您想在这种情况下使用过滤器。我可能误解了这个问题,但你实际上是在接收一个字符串,你需要避免恶意输入正确吗?
猜你喜欢
  • 2014-11-12
  • 1970-01-01
  • 2020-06-28
  • 2012-02-18
  • 2018-01-18
  • 2012-06-14
  • 2019-03-03
  • 2012-09-21
  • 2014-07-19
相关资源
最近更新 更多