![curl 在 cygwin 中下载失败,但在 os x 中却可以](https://linux22.com/image/1414182/curl%20%E5%9C%A8%20cygwin%20%E4%B8%AD%E4%B8%8B%E8%BD%BD%E5%A4%B1%E8%B4%A5%EF%BC%8C%E4%BD%86%E5%9C%A8%20os%20x%20%E4%B8%AD%E5%8D%B4%E5%8F%AF%E4%BB%A5.png)
我正在尝试在 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
然后幸福就降临了。