Cygwin で Amazon S3 から postgresql データベースのコピーをダウンロードしようとしています。しかし、すべてゼロになり、役に立たないファイルが生成されます。これが私の curl コマンドです:
curl `heroku.bat pgbackups:url` -o latest.dump --verbose
結果は次のようになります: * 状態: 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 * 状態: CONNECT => WAITCONNECT ハンドル 0x60002de60;行 1058 (接続 #0) % 合計 % 受信 % Xferd 平均速度 時間 時間 時間 現在のダウンロード アップロード 合計使用時間 残り 速度 0 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: none * 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 証明書の検証が正常に実行されました。 * 状態: PROTOCONNECT => DO handle 0x60002de60; 行 1190 (接続 #0)
GET /hkpgbackups/[メールアドレス]/b007.dump?AWSA 編集済み User-Agent: curl/7.34.0 ホスト: s3.amazonaws.com Accept:/
* 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 と一致し、私が見る限り、AWS アクセス キーを除いて Mac でも同じです。なぜ異なるのかわかりませんか?
なぜこれが違うのでしょうか?
参考までにこれは私のリソース。
答え1
これは動作するはずでしたが、実行する唯一の方法は、heroku コマンドの評価をスキップし、URL 出力をコピーして貼り付け、URL を一重引用符で囲んだ場合のみです。
curl -o 最新.dump 'https://example.com/reallyLongAndUglyUrl'
OS X で動作する理由は、出力が非常に長く、変更されないためです。しかし、出力を取得するために heroku.bat コマンドを使用しているため、cygwin では変更されます。これにより、Windows の制約が課せられます。つまり、非常に長い行にキャリッジ リターンなどが追加され、URL が分割されます。もう 1 つの手がかりは、curl が URL が変更されたことを示す 400 エラーを返すことです。修正するには、出力を dos2unix プログラムにパイプすると、curl は期待どおりに応答します。
curl -o latest.dump をheroku.bat pgbackups:url | dos2unix
実行すると幸せが訪れます。