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