Site icon 8HOST.COM

Загрузка файлов с помощью cURL

cURL (или client URL) – это библиотека и утилита командной строки для передачи данных между системами. Она поддерживает множество протоколов и часто по умолчанию установлена во многих Unix-подобных операционных системах. Благодаря своей общедоступности cURL – это отличный выбор для загрузки файлов в локальную систему, особенно в серверной среде.

В этом мануале вы научитесь использовать команду curl на примере загрузки текстового файла с веб-сервера. Вы узнаете, как просмотреть его содержимое, сохранить его локально и включить поддержку перенаправлений в curl, если файл был перемещен.

Загрузка файлов из интернета может быть опасной для системы процедурой, поэтому рекомендуем загружать файлы только из надежных источников.

1: Загрузка файлов из удаленных источников

Обычная команда curl (без каких-либо аргументов) извлечет файл и отобразит его содержимое в стандартном выводе.

Давайте попробуем загрузить файл robots.txt:

curl https://www.digitalocean.com/robots.txt

Вы увидите, что содержимое файла отображается на экране:

User-agent: *
Disallow:
sitemap: https://www.digitalocean.com/sitemap.xml
sitemap: https://www.digitalocean.com/community/main_sitemap.xml.gz
sitemap: https://www.digitalocean.com/community/questions_sitemap.xml.gz
sitemap: https://www.digitalocean.com/community/users_sitemap.xml.gz

Предоставьте утилите curl URL-адрес, и она извлечет ресурс и отобразит его содержимое на вашем экране.

Сохранение загруженных файлов

Получение файла и отображение его содержимого – это хорошо, но это не сохраняет файл в системе. Что делать, если файл все же нужно сохранить?

Чтобы сохранить удаленный файл в локальной системе с его исходным именем, добавьте аргумент –remote-name или используйте параметр -O:

curl -O https://www.digitalocean.com/robots.txt

Ваш файл будет скачан:

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
100   286    0   286    0     0   5296      0 --:--:-- --:--:-- --:--:--  5296

Вместо содержимого файла curl отображает индикатор прогресса и сохраняет файл с тем же именем, что и на удаленном сервере. Вы можете проверить всё с помощью команды cat:

cat robots.txt

Файл содержит именно то, что вы видели ранее на экране:

User-agent: *
Disallow:
sitemap: https://www.digitalocean.com/sitemap.xml
sitemap: https://www.digitalocean.com/community/main_sitemap.xml.gz
sitemap: https://www.digitalocean.com/community/questions_sitemap.xml.gz
sitemap: https://www.digitalocean.com/community/users_sitemap.xml.gz

Теперь давайте посмотрим, как выбрать новое имя для загруженного файла.

2: Сохранение загруженного файла с новым именем

Предположим, у вас уже есть локальный файл с тем же именем, что и у файла, загружаемого с удаленного сервера.

Чтобы избежать перезаписи одноименного локального файла, используйте аргумент -o или –output, за которым укажите имя файла, в который вы хотите сохранить содержимое.

К примеру, чтобы загрузить удаленный файл robots.txt в локальный файл do-bots.txt, введите следующую команду:

curl -o do-bots.txt  https://www.digitalocean.com/robots.txt

Вы снова увидите индикатор выполнения:

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
100   286    0   286    0     0   6975      0 --:--:-- --:--:-- --:--:--  7150

Теперь используйте команду cat, чтобы отобразить содержимое файла do-bots.txt и убедиться, что это именно тот загруженный вами файл:

cat do-bots.txt

Вы увидите:

User-agent: *
Disallow:
sitemap: https://www.digitalocean.com/sitemap.xml
sitemap: https://www.digitalocean.com/community/main_sitemap.xml.gz
sitemap: https://www.digitalocean.com/community/questions_sitemap.xml.gz
sitemap: https://www.digitalocean.com/community/users_sitemap.xml.gz

По умолчанию curl не поддерживает перенаправления, поэтому вы можете не получить ожидаемого результата, если файлы были перемещены. Давайте посмотрим, как можно это исправить.

3: Поддержка перенаправлений

Пока что все примеры использовали полностью определенные URL-адреса, которые включают протокол https://. Если бы вы попытались получить файл robots.txt и указали бы только домен, вы не увидели бы никаких результатов, потому что сайт может перенаправлять запросы с http:// на https://.

Вы можете проверить это с помощью флага -I, который отображает заголовки запроса, а не содержимое файла:

curl -I www.digitalocean.com

Выходные данные показывают, что URL-адрес был перенаправлен. Первая строка вывода сообщает, что он был перемещен, а строка Location сообщает, куда именно:

HTTP/1.1 301 Moved Permanently
Date: Wed, 26 Aug 2020 19:01:33 GMT
Connection: keep-alive
Cache-Control: max-age=3600
Expires: Wed, 26 Aug 2020 20:01:33 GMT
Location: https://www.digitalocean.com/robots.txt
cf-request-id: 04cdbea7a40000c5cc8d34d200000001
Server: cloudflare
CF-RAY: 5c8fcd52aea0c5cc-EWR

Вы можете использовать curl и отправить другой запрос вручную. Также вы можете использовать аргумент –location (или –L), который позволит утилите curl отправить запрос в новое место, если она встречает перенаправление. Попробуйте сделать это:

curl -L www.digitalocean.com/robots.txt

На этот раз вы увидите ожидаемый результат, поскольку curl поддерживает перенаправление:

User-agent: *
Sitemap: https://www.digitalocean.com/sitemap.xml

Вы можете комбинировать аргумент -L с некоторыми из вышеупомянутых аргументов, чтобы загрузить файл в вашу локальную систему:

curl -L -o do-bots.txt www.digitalocean.com/robots.txt

Важно! Многие онлайн-ресурсы предлагают использовать curl для загрузки скриптов и их выполнения. Однако прежде чем делать исполняемыми и запускать какие-либо загруженные скрипты, вы должны проверить их содержимое. Используйте команду less, чтобы проверить код и убедиться, что он не причинит вреда вашей системе.

Заключение

Утилита curl позволяет быстро загружать файлы из удаленной системы. Она поддерживает множество различных протоколов, а также может выполнять более сложные веб-запросы, включая взаимодействие с удаленными API-интерфейсами для отправки и получения данных.

Вы можете узнать больше об этой утилите, просмотрев справку для curl:

man curl