web-dev-qa-db-ja.com

ブラウザがダウンロードするときにこのリンクをcurlでダウンロードしないのはなぜですか?

Mac OS 10.11.6 El Capitanを実行しています。プログラムでダウンロードしたいリンクがあります:

https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg

このURLを任意のブラウザ(Safariなど)に貼り付けると、ダウンロードは完全に機能します。

ただし、curlを使用してコマンドラインから同じURLをダウンロードしようとしても機能しません。結果は空のファイルです。

$ ls -lA
$ curl -O https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
$ ls -lA
total 0
-rw-r--r--  1 myname  staff  0 Nov  7 14:07 mysql-5.7.16-osx10.11-x86_64.dmg
$ 

もちろん、ブラウザからファイルを取得できますが、上記のcurlコマンドが機能しない理由を理解したいと思います。

このファイルをcurl正しくダウンロードできないのはなぜですかそれがWebサイトに明らかに存在し、グラフィカルWebブラウザーを介して正しくアクセスおよびダウンロードできる場合?

31
mattobob

次のURLへのリダイレクトがWebサーバー側にあります:http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg。これはCDNであるため、正確な動作(リダイレクトされるかどうか)は場所によって異なる場合があります。

curlはデフォルトではリダイレクトに従いません。そうするように指示するには、-L引数を追加します。

curl -L -O https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.16-osx10.11-x86_64.dmg
60
techraf

ブラウザがファイルをダウンロードできる場合は、ブラウザの動作を確認できます。 google chromeでは、次のようにして何が起こっているかを確認できます。

1)[表示>開発者>開発者ツール>ネットワークタブ>ヘッダータブ]

2)ダウンロードリンクをクリックします。

3)ファイルのリンクが開発者ツールのタブに表示されます。

4)ファイルを右クリックして、[コピー]> [cURLとしてコピー]を選択します。

これで、機能するカールリンクが作成されました。それはおそらくあなたがトリミングすることができる余分なパラメーターを持っているでしょう。

詳細: https://lornajane.net/posts/2013/chrome-feature-copy-as-curl

6
cage

この投稿のコメントの1つを回答に変換します。

機能するために特定のヘッダーを必要とする多くのHTTP/HTTPSリンクがあります。したがって、これはWebブラウザーからの動作する応答になりますが、curlのようなバックエンドWebリクエストでは動作しない応答になります。

次のヘッダーがすべて必要なサイトに出くわしました。それらを指定しないと、タイムアウトが発生しました。

  httpget.setHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36");
  httpget.setHeader("Upgrade-Insecure-Requests", "1");
  httpget.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
  httpget.setHeader("Accept-Encoding", "gzip, deflate, br");
  httpget.setHeader("Accept-Language", "en-US,en;q=0.9");
  httpget.setHeader("Connection", "keep-alive");
  httpget.setHeader("Host", "www.thehost.com");
0