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ブラウザーを介して正しくアクセスおよびダウンロードできる場合?
次の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
ブラウザがファイルをダウンロードできる場合は、ブラウザの動作を確認できます。 google chromeでは、次のようにして何が起こっているかを確認できます。
1)[表示>開発者>開発者ツール>ネットワークタブ>ヘッダータブ]
2)ダウンロードリンクをクリックします。
3)ファイルのリンクが開発者ツールのタブに表示されます。
4)ファイルを右クリックして、[コピー]> [cURLとしてコピー]を選択します。
これで、機能するカールリンクが作成されました。それはおそらくあなたがトリミングすることができる余分なパラメーターを持っているでしょう。
詳細: https://lornajane.net/posts/2013/chrome-feature-copy-as-curl
この投稿のコメントの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");