当直接从ApacheAnt调用时,为什么使用SSL的cURL不起作用

当直接从ApacheAnt调用时,为什么使用SSL的cURL不起作用,ssl,ant,curl,Ssl,Ant,Curl,我正在用https访问一个网站。如果我在ApacheAnt的exec任务中使用curl,它会失败,抱怨“libcurl中不支持或禁用https”;但是,如果我使用sh-c通过shell从Ant发出相同的调用,它就会工作 这是我的蚂蚁目标: <target name="list-milestones"> <echo>Via SH</echo> <exec executable="sh" dir="." failonerror="true"&

我正在用https访问一个网站。如果我在ApacheAnt的
exec
任务中使用curl,它会失败,抱怨“libcurl中不支持或禁用https”;但是,如果我使用sh-c通过shell从Ant发出相同的调用,它就会工作

这是我的蚂蚁目标:

<target name="list-milestones">
    <echo>Via SH</echo>
    <exec executable="sh" dir="." failonerror="true">
        <arg value='-c' />
        <arg value='/bin/env' />
    </exec>
    <exec executable="sh" dir="." failonerror="true">
        <arg value='-c' />
        <arg value='/usr/bin/curl --config ${user.home}/.curlrc -k -X GET -H "Accept: application/xml" "https://www.assembla.com/spaces/milestones/all/tibant" -o "build/milestones.xml"' />
    </exec>
    <echo>Direct</echo>
    <exec executable="/bin/env" dir="." failonerror="true">
    </exec>
    <exec executable="/usr/bin/curl" dir="." failonerror="true">
        <arg value='--config' />
        <arg value='${user.home}/.curlrc' />
        <arg value='-k' />
        <arg value='-X' />
        <arg value='GET' />
        <arg value='-H' />
        <arg value='"Accept: application/xml"' />
        <arg value='"https://www.assembla.com/spaces/milestones/all/tibant"' />
        <arg value='-o' />
        <arg value='"build/milestones.xml"' />
    </exec>
</target>
我对环境进行了分类和比较,没有发现任何显著的差异


这把我难住了。救命啊

我认为这表明它运行不同的curl可执行文件(从而不同的libcurl),因为如果您尝试使用libcurl不支持的协议,libcurl会报告这条消息


确保错误文本中“https”前面没有空格,好像问题恰恰在于:URL中有一个初始空格。

我认为这表明它运行不同的curl可执行文件(以及不同的libcurl),如果您尝试使用libcurl不支持的协议,那么libcurl会报告这条消息


确保错误文本中“https”前面没有空格,好像问题恰恰在于:URL中有一个初始空格。

Ant出了问题。我可以用MacOs和Ant 1.8.2重现您的错误。 使用这个简单的Java main,它可以工作:

public static void main(String[] args) throws Throwable {
    Process exec = Runtime.getRuntime().exec(
            new String[] { "/usr/bin/curl", "-k", "-X", "GET", "-H", "Accept: application/xml",
                    "https://www.assembla.com/spaces/milestones/all/tibant", "-o", "build/milestones.xml" });
    System.out.println(exec.waitFor());
    System.err.println(IOUtils.toString(exec.getErrorStream()));
    System.out.println(IOUtils.toString(exec.getInputStream()));
}

欢迎您在Ant的bugzilla中打开一个问题:

Ant出了问题。我可以用MacOs和Ant 1.8.2重现您的错误。 使用这个简单的Java main,它可以工作:

public static void main(String[] args) throws Throwable {
    Process exec = Runtime.getRuntime().exec(
            new String[] { "/usr/bin/curl", "-k", "-X", "GET", "-H", "Accept: application/xml",
                    "https://www.assembla.com/spaces/milestones/all/tibant", "-o", "build/milestones.xml" });
    System.out.println(exec.waitFor());
    System.err.println(IOUtils.toString(exec.getErrorStream()));
    System.out.println(IOUtils.toString(exec.getInputStream()));
}

欢迎您在Ant的bugzilla中打开一个问题:

您不需要在
arg
值中使用额外的双引号
。以下内容对我有用。引号被视为文本,并传递给curl-因此它认为您尝试使用的协议是
”https
而不是您想要的https

<exec executable="/usr/bin/curl" dir="." failonerror="true">
    <arg value='--config' />
    <arg value='${user.home}/.curlrc' />
    <arg value='-k' />
    <arg value='-X' />
    <arg value='GET' />
    <arg value='-H' />
    <arg value='Accept: application/xml' />
    <arg value='https://www.assembla.com/spaces/milestones/all/tibant' />
    <arg value='-o' />
    <arg value='build/milestones.xml' />
</exec>


Accept…
https:…
build/milesones.xml
是更改后的arg值。

您不需要额外的双引号
arg
值中。以下内容适合我。引号被视为文本,并传递给curl-因此它认为您尝试使用的协议是
“https
,而不是您想要的
https

<exec executable="/usr/bin/curl" dir="." failonerror="true">
    <arg value='--config' />
    <arg value='${user.home}/.curlrc' />
    <arg value='-k' />
    <arg value='-X' />
    <arg value='GET' />
    <arg value='-H' />
    <arg value='Accept: application/xml' />
    <arg value='https://www.assembla.com/spaces/milestones/all/tibant' />
    <arg value='-o' />
    <arg value='build/milestones.xml' />
</exec>


Accept…
https:…
build/milesones.xml
是更改后的arg值。

起初我也认为它可能使用不同的可执行文件,这就是为什么我在这两种情况下都使用完整路径
/usr/bin/curl
。我还可以确认上面是代码的副本和过去,并且没有任何程序g空间。即使某个讨厌我的答案的人-1,我会重复说libcurl是指协议XXX被禁用的人,如果在一种情况下它没有,在另一种情况下它不能是同一个libcurl。讨厌与否。在我看来,你的答案是错误的,没有帮助,这就是为什么我-1’使用它。这并不意味着我是一个“讨厌者”“。如果您仍然认为自己是对的,请详细说明不可见空间是如何涉及的,如何解析为不同的可执行文件,或者如何使用不同版本的libcurl。在我发帖之前,我有同样的想法(除了空间),并试图排除它们;我可以解释这种行为,因此我的帖子就是这样。那么请告诉我,不同的调用最终是如何使用不同版本的libcurl的?因为归根结底这就是问题所在。目前,您的回答只是提醒了我,我并没有声称理解或意识到它将如何调用不同的版本(我也不认为我们有足够的数据来说明),我只是将此作为一种解释,说明如何在一种情况下而不是在另一种情况下获得输出。我唯一能想到的另一个选择是,在其中一个案例中,有一个额外的选项,它限制了卷曲来考虑什么协议(用-PROTO)。最初,我也可能使用不同的可执行文件,这就是为什么我在这两种情况下都使用完整路径<代码> /Ur/bin /Curl < /代码>的原因。我还可以确认上面是代码的副本和过去,前面没有空格。即使某个讨厌我的答案的人-1,我也会重复libcurl是说协议XXX被禁用的那个,如果在一种情况下没有,在另一种情况下它不能是同一个libcurl。不管你讨厌与否,我认为你的回答是错误的,没有任何帮助,这就是我为什么选择它的原因。这并不意味着我是一个“憎恨者”。如果您仍然认为自己是对的,请详细说明不可见空间是如何涉及的,如何解析为不同的可执行文件,或者如何使用不同版本的libcurl。在我发帖之前,我有同样的想法(除了空间),并试图排除它们;我可以解释这种行为,因此我的帖子就是这样。那么请告诉我,不同的调用最终是如何使用不同版本的libcurl的?因为归根结底这就是问题所在。目前,您的回答只是提醒了我,我并没有声称理解或意识到它将如何调用不同的版本(我也不认为我们有足够的数据来说明),我只是将此作为一种解释,说明如何在一种情况下而不是在另一种情况下获得输出。我唯一能想到的另一个选择是,在其中一个案例中,有一个额外的选项,它限制了卷曲来考虑什么协议。