Curl – это отличный инструмент для загрузки файлов в терминале Linux.
Обычный синтаксис для загрузки файла с тем же именем, что и исходный файл, довольно прост:
curl -O URL_of_the_file
В большинстве случаев это работает.
Однако вы заметите, что иногда при загрузке файла с GitHub или SourceForge пользователь не получает правильный файл.
Например, я пытался загрузить скрипт archinstall в формате tar gz.
Файлы расположены на странице релиза.
Если я открою ссылку на исходный код в браузере, то получу исходный код в формате .tar.gz.
⚓ Выполнение POST-запроса с помощью Curl [Практические примеры]
Однако если я использую терминал для загрузки того же файла с помощью команды curl, я получаю маленький файл, который не имеет правильного формата архива.
tar -zxvf v2.4.2.tar.gz
gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now
Когда я выполняю команду file, чтобы узнать точный тип файла, он сообщает мне, что это документ HTML.
file v2.4.2.tar.gz
v2.4.2.tar.gz: HTML document, ASCII text, with no line terminators
HTML-документ вместо архива zip или tarball?
В чем проблема?
Сейчас я покажу вам быстрое решение.
🖧 В чем разница между curl и Wget?
Правильная загрузка архивного файла с помощью curl
Проблема здесь в том, что URL, который у вас есть, перенаправляет на фактический архивный файл.
Чтобы получить это, вам нужно использовать дополнительные опции
curl -JLO URL_of_the_file
Варианты могут быть в любом порядке. Просто проще запомнить J LO (Дженнифер Лопес).
Вот краткое объяснение опций, основанное на man-странице команды curl.
- J: Эта опция указывает опции -O, –remote-name использовать указанное сервером имя файла Content-Disposition вместо извлечения имени файла из URL.
- L: Если сервер сообщает, что запрошенная страница переместилась в другое место (на это указывает заголовок Location: и код ответа 3XX), эта опция заставит curl повторить запрос на новом месте.
- O: С этой опцией вам не нужно указывать имя выходного файла для загрузки.
Бонусный совет: Вам нужно войти в систему?
Это работает для общедоступных файлов.
Но если вы попытаетесь загрузить файлы из частных репозиториев или GitLab, то вы можете увидеть сообщение о перенаправлении на страницу входа.
<html><body>You are being <a href="https://gitlab.com/users/sign_in">redirected</a>.</body></html>
В таких случаях, пожалуйста, укажите API-токен с опцией -H.
Надеюсь, этот небольшой совет поможет вам правильно загружать архивные файлы с помощью Curl.
Дайте мне знать, если вы все еще сталкиваетесь с проблемами при загрузке с помощью Curl.