curl 在 cygwin 中下载失败,但在 os x 中却可以

curl 在 cygwin 中下载失败,但在 os x 中却可以

我正在尝试在 cygwin 中从 Amazon S3 下载一份 postgresql db 副本。但是它的结果全都是零,导致文件无用。这是我的 curl 命令:

 curl `heroku.bat pgbackups:url` -o latest.dump --verbose

结果为:* STATE: INIT => CONNECT 句柄 0x60002de60; 行 1011(连接 #-5000)* DNS 缓存中未找到主机名* 尝试 54.231.1.232...* 添加句柄:conn:0x600069f80* 添加句柄:send:0* 添加句柄:recv:0* Curl_addHandleToPipeline:长度:1* 0x60002de60 位于发送管道头!* - Conn 0(0x600069f80)send_pipe:1,recv_pipe:0* STATE: CONNECT => WAITCONNECT 句柄 0x60002de60;行 1058(连接 #0)% 总计 % 已接收 % Xferd 平均速度 时间 时间 时间 当前 Dload 上传 总花费 剩余速度 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* 已连接到 s3.amazonaws.com(54.231.1.232)端口 443(#0) * 成功设置证书验证位置:* CAfile:/usr/ssl/certs/ca-bundle.crt CApath:无 * SSLv3,TLS 握手,客户端 hello(1):} [未显示数据] * STATE:WAITCONNECT => PROTOCONNECT 句柄 0x60002de60;行 1171(连接 #0)* SSLv3,TLS 握手,服务器 hello(2):{[未显示数据] * SSLv3,TLS 握手,CERT(11):{[未显示数据] * SSLv3,TLS 握手,服务器完成(14):{[未显示数据] * SSLv3,TLS 握手,客户端密钥交换(16):} [未显示数据] * SSLv3,TLS 更改密码,客户端 hello(1):} [未显示数据] * SSLv3,TLS 握手,完成(20):} [未显示数据] * SSLv3,TLS 更改密码,客户端 hello(1):{[未显示数据] * SSLv3,TLS 握手,完成(20):{[未显示数据] * 使用 AES128-SHA 的 SSL 连接* 服务器证书:已编辑* SSL 证书验证成功。* STATE:PROTOCONNECT => DO 处理 0x60002de60;线路 1190(连接 #0)

获取 /hkpgbackups/[电子邮件保护]/b007.dump?AWSA 已编辑用户代理:curl/7.34.0 主机:s3.amazonaws.com 接受:/

 * STATE: DO => DO_DONE handle 0x60002de60; line 1263 (connection #0)
 * STATE: DO_DONE => WAITPERFORM handle 0x60002de60; line 1384 (connection #0)
 * STATE: WAITPERFORM => PERFORM handle 0x60002de60; line 1395 (connection #0)
 * HTTP 1.1 or later with persistent connection, pipelining supported
 < HTTP/1.1 400 Bad Request
 < Transfer-Encoding: chunked
 < Date: Wed, 02 Jul 2014 21:03:39 GMT
 < Connection: close
 * Server AmazonS3 is not blacklisted
 < Server: AmazonS3
 { [data not shown]
 * STATE: PERFORM => DONE handle 0x60002de60; line 1565 (connection #0)
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
 * Closing connection 0

在同一子网的 OS X 终端中运行此命令会产生大致相同的输出,只是我得到了 http/1.1 请求的 200。

那么为什么我在 Mac 上得到 200,而在 Windows 上 cygwin 得到 400?我尝试过排除其他潜在变量,但这台机器上的 cygwin 没有得到 200。我可以告诉你,据我所知,cygwin 中编辑后的 ​​URL 与 heroku 命令输出中的 URL 匹配,在 mac 中也是如此,除了 AWS 访问密钥。不明白为什么它们会不同?

为什么会有所不同呢?

作为参考这是我的资源

答案1

这应该可以工作,但是它运行的唯一方法是跳过 heroku 命令的评估,只需复制粘贴 url 输出,并且仅当我将 URL 括在单引号中时才可以。

curl -o 最新.dump 'https://example.com/reallyLongAndUglyUrl

它在 OS X 中工作的原因是输出很长,而且不会被混淆。但它在 cygwin 中会被混淆,因为我使用 heroku.bat 命令来获取输出。这施加了 Windows 限制 - 也就是说,它会在很长的行中添加回车符等,这会破坏 URL。另一个线索是 curl 返回 400 错误,表示 URL 被混淆了。解决方法是将输出通过管道传输到 dos2unix 程序,然后 curl 就会做出应有的响应。

curl -o latest.dumpheroku.bat pgbackups:url | dos2unix然后幸福就降临了。

相关内容