cURL (расшифровывается как Client URL) — программное обеспечение, которое предоставляет библиотеку libcurl и инструмент командной строки curl. Возможности cURL огромны, во многих опциях легко потеряться.
curl — инструмент для передачи данных с сервера или на него, при этом используется один из поддерживаемых протоколов: DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET и TFTP. Команда предназначена для работы без взаимодействия с пользователем.
Команда curl запускается из командной строки и предустановлена в большинстве дистрибутивов Linux.
Варианты применения:
- доступ без браузера;
- внутри shell-скриптов;
- для тестирования API.
Запрос страницы
Если никакие аргументы не указаны, то команда curl выполняет HTTP-запрос get и отображает статическое содержимое страницы. Оно аналогично тому, что мы видим при просмотре исходного кода в браузере.
curl www.google.com
Скачивание файла
Есть два варианта этой команды.
- Скачать файл и сохранить под оригинальным именем (testfile.tar.gz).
curl -O https://testdomain.com/testfile.tar.gz
- Скачать файл и сохранить под другим именем.
curl -o custom_file.tar.gz https://testdomain.com/testfile.tar.gz
Еще можно скачать несколько файлов одной командой, хотя в мануале так делать не рекомендуют.
curl -O https://testdomain.com/testfile.tar.gz -O https://testdomain.com/testfile2.tar.gz
Получение заголовков HTTP
Если вы хотите посмотреть, какие заголовки отдает сервер, то можно использовать опции -I или -head. Они позволяют получить заголовок без тела документа.
curl -I https://www.google.com
HTTP/2 200
content-type: text/html; charset=ISO-8859-1
p3p: CP="This is not a P3P policy! See g.co/p3phelp for more info."
date: Thu, 30 Dec 2021 08:02:28 GMT
server: gws
x-xss-protection: 0
x-frame-options: SAMEORIGIN
expires: Thu, 30 Dec 2021 08:02:28 GMT
cache-control: private
set-cookie: 1P_JAR=2021-12-30-08; expires=Sat, 29-Jan-2022 08:02:28 GMT; path=/; domain=.google.com; Secure
set-cookie: NID=511=g2q8nvtZVqY3eB3xl8c8D2tB-CuU-EbIvyfVtkOUuaKBQM1tXCNckN6VwMsz9Oq1q4vupwd8qiCP136ddmOWONHJ7DPA1r81TVpSMUhSeWet6ggRIyX1ZtQZwu09GdipaBw3aVPK0wAj9WvOjRQqPAswXhhC-fFhwjbunNqbAQE; expires=Fri, 01-Jul-2022 08:02:28 GMT; path=/; domain=.google.com; HttpOnly
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
Игнорирование ошибки неправильных или самоподписанных сертификатов
Когда вы тестируете веб-приложение или API, то в вашем тестовом окружении могут быть самоподписанные или неправильные SSL-сертификаты. По умолчанию curl верифицирует все сертификаты. Чтобы он не выдавал ошибку о неверных сертификатах и устанавливал соединение для тестирования, используйте опцию -k или -insecure.
curl -k https://localhost/my_test_endpoint
Отправка POST-запроса
Иногда для тестирования API нужно отправить какие-либо данные, обычно это делают через POST-запрос. Если вы делаете POST-запрос при помощи curl, то можете отправить данные либо в виде списка имя=значение, либо в виде JSON.
- Запрос в виде списка имя=значение.
curl --data "param1=test1¶m2=test2" http://test.com
- Запрос в виде JSON.
curl -H 'Content-Type: application/json' --data '{"param1":"test1","param2":"test2"}' http://www.test.com
Параметр –data эквивалентен -d, оба указывают curl выполнить HTTP POST-запрос.
Указание типа запроса
Если curl не передаются никакие данные, то по умолчанию он выполняет HTTP GET запрос. Но если вам, например, нужно обновить данные, а не пересоздать их заново, то curl поддерживает опции, указывающие тип запроса. Параметры -x или –request позволяют указать тип HTTP-запроса, который используется для сообщения с сервером.
# updating the value of param2 to be test 3 on the record id
curl -X 'PUT' -d '{"param1":"test1","param2":"test3"}' \http://test.com/1
Использование авторизации
API защищено авторизацией по логину-паролю — вы можете передать пару логин-пароль, используя параметр -u или –user. Если просто передать логин, то curl запросит пароль в командной строке. Используете параметр несколько раз — для авторизации на сервер будет передано только последнее значение.
curl -u <user:password> https://my-test-api.com/endpoint1
Управление резольвом имен
Вы хотите протестировать API перед развертыванием и перенаправить запрос на тестовую машину — это можно сделать, указав альтернативный резольв имени эндпоинта для данного запроса. Все работает эквивалентно пропиcыванию хоста в /etc/hosts.
curl --resolve www.test.com:80:localhost http://www.test.com/
Загрузка файла
О возможности загрузки файла через curl я узнал недавно. Не был уверен, что это возможно, но, по всей видимости, это так: curl с опцией -F эмулирует отправку заполненной формы, когда пользователь нажимает кнопку отправки. Опция указывает curl передавать данные в виде POST-запроса, используя multipart / form-data Content-Type.curl -F @field_name=@path/to/local_file
Вы можете загрузить несколько файлов, повторяя параметр -F.
curl -F @field_name=@path/to/local_file @field_name=@path/to/local_file_2
Измерение продолжительности соединения
Вы можете использовать опцию -w для отображения информации в stdout после завершения передачи. Она поддерживает отображение набора переменных. Например, можно узнать общее время, которое потребовалось для успешного выполнения запроса. Это удобно, если вам нужно определить время загрузки или скачивания с помощью curl.
curl -w "%{time_total}\n" -o /dev/null -s www.test.com
CURL -ключи:
-# — отображать простой прогресс-бар во время загрузки;
-0 — использовать протокол http 1.0;
-1 — использовать протокол шифрования tlsv1;
-2 — использовать sslv2;
-3 — использовать sslv3;
-4 — использовать ipv4;
-6 — использовать ipv6;
-A — указать свой USER_AGENT;
-b — сохранить Cookie в файл;
-c — отправить Cookie на сервер из файла;
-C — продолжить загрузку файла с места разрыва или указанного смещения;
-m — максимальное время ожидания ответа от сервера;
-d — отправить данные методом POST;
-D — сохранить заголовки, возвращенные сервером в файл;
-e — задать поле Referer-uri, указывает с какого сайта пришел пользователь;
-E — использовать внешний сертификат SSL;
-f — не выводить сообщения об ошибках;
-F — отправить данные в виде формы;
-G — если эта опция включена, то все данные, указанные в опции -d будут передаваться методом GET;
-H — передать заголовки на сервер;
-I — получать только HTTP заголовок, а все содержимое страницы игнорировать;
-j — прочитать и отправить cookie из файла;
-J — удалить заголовок из запроса;
-L — принимать и обрабатывать перенаправления;
-s — максимальное количество перенаправлений с помощью Location;
-o — выводить контент страницы в файл;
-O — сохранять контент в файл с именем страницы или файла на сервере;
-p — использовать прокси;
—proto — указать протокол, который нужно использовать;
-R — сохранять время последнего изменения удаленного файла;
-s — выводить минимум информации об ошибках;
-S — выводить сообщения об ошибках;
-T — загрузить файл на сервер;
-v — максимально подробный вывод;
-y — минимальная скорость загрузки;
-Y — максимальная скорость загрузки;
-z — скачать файл, только если он был модифицирован позже указанного времени;
-V — вывести версию.
Скачивание файла
Если вам требуется скачать файл, запустите curl с опцией –O или –o. Первая из них сохраняет файл в текущей рабочей директории под тем же именем, что и в удаленном месторасположении. Вторая опция позволяет вам указать другое имя и/или место для скачивания.
Cохранение файла под исходным именем (yourfile) в текущей рабочей директории.
$ curl -O http://yourdomain.com/yourfile
Cохранение файла под именем newfile в директории /tmp/examplе/.
$ curl -o /tmp/examplе/newfile http://yourdomain.com/yourfile.tar.gz - сохранение файла под именем newfile.tar.gz в директории /tmp/examplе/
Возобновление прерванной загрузки
Если скачивание по какой-то причине было прервано (например, пользователь нажал Ctrl+C), вы легко можете возобновить его с момента остановки при помощи опции -C – (дефис, С, тире):
$ curl -C - -O http://yourdomain.com/yourfile
Скачивание нескольких файлов
Следующая команда позволит вам скачать info.html с http://yoursite.com и about.html c http://mysite.com в один прием:
$ curl -O http://yoursite.com/info.html/info -O http://mysite.com/about.html/about
Если использовать curl вместе с командой xargs, можно скачивать файлы в соответствии со списком URL, заданном в файле (в данном примере listurls.txt):
$ xargs -n 1 curl < listurls.txt
Использование прокси-сервера
Если вы подключены через прокси-сервер, нужно указать его команде curl при помощи следующих опций (в данном примере имя сервера proxy.yourdomain.com, порт 8080, имя пользователя user, пароль qwerty1234):
$ curl -x proxy.yourdomain.com:8080 -U user:qwerty1234 -O http://yourdomain.com/yourfile
Если ваш прокси-сервер не требует аутентификации, опцию -U user:qwerty1234 указывать не нужно.
Запрос HTTP-заголовков
HTTP-заголовки позволяют удаленному веб-серверу помимо ответа на сам запрос отправлять дополнительную информацию. Она предоставляет клиенту данные о том, как обрабатывать ответ:
Для запроса HTTP-заголовков веб-сайта выполните команду с опцией -I:
$ curl -I https://the-devops.ru
Также эту информацию можно получить, воспользовавшись функциями браузера для разработчиков.
cURL POST-запросы с параметрами
Следующая команда отправит на https://yourdomain.com/info.php параметры firstName и lastName с соответствующими значениями:
$ curl --data "firstName=Ivan&lastName=Ivanov" https://yourdomain.com/info.php
Этим приемом можно пользоваться для симуляции работы обычных веб-форм.
Скачивание файлов с FTP-сервера
Следующая команда скачивает в текущую рабочую директорию файл yourfile с удаленного FTP-сервера ftp://yourftpserver (имя пользователя user, пароль qwerty1234):
$ curl -u user:qwerty1234 -O ftp://yourftpserver/yourfile
Если FTP-сервер поддерживает анонимный вход, параметр –u с именем пользователя и пароля указывать не нужно.
Загрузка файлов на FTP-сервер
Для загрузки локального файла mylocalfile.tar.gz воспользуйтесь следующей командой:
$ curl -u user:qwerty1234 -T mylocalfile.tar.gz ftp://yourftpserver
Указание агента пользователя
Агент пользователя – часть информации HTTP-запроса. Она показывает, каким браузером пользуется клиент. Можно посмотреть, что имеющаяся версия curl передает по умолчанию и установить новое значение:
$ curl -I http://localhost --user-agent "I am a new web browser"
Запись файлов cookie с веб-сайта
Хотите посмотреть, какие файлы cookie скачиваются на ваш компьютер, когда вы заходите на определенный сайт? Опция —cookie-jar сохраняет их список в файл, который в дальнейшем можно просмотреть при помощи команды cat.
$ curl --cookie-jar cookies.txt https://itproffi.ru/
Отправка файлов cookie на сайт
Полученные в предыдущем примере файлы cookie можно использовать в дальнейших запросах к тому же самому сайту:
$ curl --cookie cookies.txt https://itproffi.ru
Изменение разрешения имен
Если вы веб-разработчик и хотите протестировать локальную версию сайта, прежде чем загружать его на сервер, при помощи опции —resolve можно указать curl выполнять разрешение имени вашего сайта на адрес локального узла, например:
$ curl --resolve www.yourdomain.com:80:localhost http://www.yourdomain.com/
Таким образом, при запросе на http://www.yourdomain.com curl будет запрашивать сайт с локального узла, а не использовать DNS или файл /etc/hosts.
Ограничение скорости скачивания
Чтобы curl не занимал всю пропускную способность канала, можно ограничить скорость скачивания при помощи опции —limit-rate:
$ curl --limit-rate 100K http://yourdomain.com/yourfile -O
Заключение
Мы рассмотрели краткую историю появления curl и наиболее характерные примеры применения этой команды. Для более подробной информации можно обратиться к соответствующей man-странице.
Свежие комментарии