10 команд curl, которые вам следует знать — Разработка на vc.ru
Команда Mail.ru Cloud Solutions перевела статью, автор которой составил краткий справочник часто используемых команд curl для протоколов HTTP/HTTPS. Это не замена официального руководства по cURL, скорее, краткий конспект.
200 457 просмотров
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 для тестирования API, иногда просто вставляя команды, которые нашел в интернете. Но я хочу разобраться в curl и лучше понять его особенности. Так что поделюсь некоторыми командами, с которыми столкнулся во время работы.
Запрос страницы
Если никакие аргументы не указаны, то команда 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
curl -I https://www.google.com HTTP/1.1 200 OK 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, 04 Jun 2020 15:07:42 GMT Server: gws X-XSS-Protection: 0 X-Frame-Options: SAMEORIGIN Transfer-Encoding: chunked Expires: Thu, 04 Jun 2020 15:07:42 GMT Cache-Control: private Set-Cookie: 1P_JAR=2020-06-04-15; expires=Sat, 04-Jul-2020 15:07:42 GMT; path=/; domain=.google.com; Secure Set-Cookie: <cookie_info>
Игнорирование ошибки неправильных или самоподписанных сертификатов
Когда вы тестируете веб-приложение или 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 запрос.
# 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 запросит пароль в командной строке. Используете параметр несколько раз — для авторизации на сервер будет передано только последнее значение.
Управление резольвом имен
Вы хотите протестировать 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 @[email protected]/to/local_file
Вы можете загрузить несколько файлов, повторяя параметр -F.
curl -F @[email protected]/to/local_file @[email protected]/to/local_file_2
Измерение продолжительности соединения
Вы можете использовать опцию -w для отображения информации в stdout после завершения передачи. Она поддерживает отображение набора переменных. Например, можно узнать общее время, которое потребовалось для успешного выполнения запроса. Это удобно, если вам нужно определить время загрузки или скачивания с помощью curl.
curl -w «%{time_total}\n» -o /dev/null -s www.test.com
Это некоторые из опций, которые можно использовать с curl. Надеюсь, информация была вам полезна и статья понравилась.
Удачи!
Что еще почитать:
- Иллюстрированное руководство по полезным инструментам командной строки.
- Что происходит, когда вы обновляете свой DNS.
- Наш Телеграм-канал о цифровой трансформации.
Curl | HTTP API
Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером
Для тестирования HTTP API одного браузера недостаточно. Браузером можно пользоваться только в самых простых ситуациях, где не нужно выставлять заголовки и делать запросы, отличные от GET. Во всех остальных случаях нужны более мощные и специализированные инструменты. Одним из таких инструментов мы научимся пользоваться в этом уроке.
Curl — это утилита командной строки, созданная в 1998 году. Она невероятно распространена и активно используется для скачивания файлов и в скриптах автоматизации. В документации по API у многих сервисов есть примеры того, как выполнить запрос с использованием curl.
Утилита curl включена по умолчанию в состав некоторых операционных систем. Если у вас ее нет, то установите ее такой командой:
# macos brew install curl # ubuntu, windows (wsl) apt install curl
Проверьте, что все работает:
curl --version curl 7.79.1
Самый простой способ использовать curl — это выполнить GET-запрос к какому-то сайту:
curl https://code-basics.com # Здесь появится тело ответа
В таком варианте curl распечатает на экран тело ответа — в нашем случае, HTML сайта. Его можно сохранить в файл, выполнив перенаправление:
curl https://code-basics.com > code-basics.html
Если мы хотим посмотреть заголовки ответа, то запрос станет таким:
# --head - запрос с методом HEAD curl --head https://code-basics. com HTTP/2 200 date: Thu, 28 Apr 2022 22:19:39 GMT content-type: text/html; charset=utf-8 cache-control: max-age=0, private, must-revalidate ...
В таком случае curl отправляет HEAD-запрос, на который сервер должен вернуть заголовки без тела. По спецификации заголовки, возвращаемые в случае HEAD-запроса, должны совпадать с заголовками GET-запроса. Но на практике ответ зависит от настроек сервера. Поэтому для точности лучше выполнить GET-запрос:
# -X, --request - задает метод запроса # --head в этом случае игнорирует тело при выводе curl --head -X GET https://code-basics.com HTTP/2 200 date: Thu, 28 Apr 2022 22:19:39 GMT content-type: text/html; charset=utf-8 cache-control: max-age=0, private, must-revalidate ...
Если нужно увидеть не только ответ, но и запрос, то подойдет флаг —verbose. Он покажет все, включая тело ответа:
# Вывод сокращен # -v, --verbose curl -v https://code-basics.com * Trying 104.26.0.21:443... * Connected to code-basics.com (104. 26.0.21) port 443 (#0) * SSL connection using TLSv1.3 / AEAD-AES256-GCM-SHA384 > GET / HTTP/2 > Host: code-basics.com > user-agent: curl/7.79.1 > accept: */* > * Connection state changed (MAX_CONCURRENT_STREAMS == 256)! < HTTP/2 200 < date: Thu, 28 Apr 2022 22:24:06 GMT < content-type: text/html; charset=utf-8 < referrer-policy: strict-origin-when-cross-origin < cache-control: max-age=0, private, must-revalidate < # Тут еще и тело
Указание заголовков:
# -H, --header curl -H "Content-Type: application/json" https://dummyjson.com/users
Указание тела в запросе:
# \ - нужен для указания многострочного кода в терминале curl -X POST https://dummyjson.com/users/add \
Искусство написания сценариев HTTP-запросов с помощью Curl
curl / Docs / Tool / HTTP-скрипты
Предыстория
Этот документ предполагает, что вы знакомы с HTML и общими сетями.
Увеличение количества приложений, перемещаемых в Интернет, привело к тому, что «Сценарии HTTP» стали более востребованными и востребованными. Иметь возможность автоматически извлекать информацию из Интернета, подделывать пользователей, публиковать или загружать данные на веб-серверы — все это важные задачи сегодня.
Curl — это инструмент командной строки для выполнения всех видов манипуляций с URL-адресами и их передачи, но в этом конкретном документе основное внимание будет уделено тому, как использовать его при выполнении HTTP-запросов для развлечения и получения прибыли. Я предполагаю, что вы знаете, как вызвать curl --help
или curl --manual
, чтобы получить основную информацию об этом.
Программа Curl не предназначена для того, чтобы делать все за вас. Он делает запросы, получает данные, отправляет данные и извлекает информацию. Вероятно, вам нужно склеить все вместе, используя какой-то скриптовый язык или повторяющиеся ручные вызовы.
Протокол HTTP
HTTP — это протокол, используемый для получения данных с веб-серверов. Это простой протокол, основанный на TCP/IP. Протокол также позволяет отправлять информацию на сервер от клиента, используя несколько различных методов, как будет показано здесь.
HTTP представляет собой простые текстовые строки ASCII, отправляемые клиентом на сервер для запроса определенного действия, а затем сервер отвечает несколькими текстовыми строками, прежде чем фактическое запрошенное содержимое будет отправлено клиенту.
Клиент curl отправляет HTTP-запрос. Запрос содержит метод (например, GET, POST, HEAD и т. д.), ряд заголовков запроса и иногда тело запроса. HTTP-сервер отвечает строкой состояния (указывающей, все ли прошло хорошо), заголовками ответа и чаще всего также телом ответа. Часть «тело» — это запрошенные вами простые данные, такие как фактический HTML или изображение и т. д. команд, которые curl отправляет на сервер, а также несколько других информационных текстов.
--verbose
— самая полезная опция, когда дело доходит до отладки или даже понимания взаимодействия curl<->сервера.
Иногда даже --verbose
недостаточно. Затем --trace
и --trace-ascii
предлагают еще больше подробностей, поскольку они показывают все, что curl отправляет и получает. Используйте его так:
curl --trace-ascii debugdump.txt http://www.example.com/
См. время
Много раз вы можете задаться вопросом, что именно занимает все время, или вы просто хотите знать количество миллисекунд между двумя точками в передаче. Для тех и других подобных ситуаций --trace-time
— это то, что вам нужно. Он будет добавлять время к каждой строке вывода трассировки:
curl --trace-ascii d.txt --trace-time http://example.com/
См. ответ
По умолчанию curl отправляет ответ на стандартный вывод. Вам нужно перенаправить его куда-нибудь, чтобы избежать этого, чаще всего это делается с помощью -o
или -O
.
Spec
Формат унифицированного указателя ресурсов определяет адрес определенного ресурса в Интернете. Вы знаете это, вы видели такие URL-адреса, как https://curl.se или https://example.com, миллион раз. RFC 3986 — каноническая спецификация. И да, официальное имя не URL, а URI.
Хост
Имя хоста обычно преобразуется с помощью DNS или вашего файла /etc/hosts в IP-адрес, и это то, с чем curl будет взаимодействовать. В качестве альтернативы вы указываете IP-адрес непосредственно в URL-адресе вместо имени.
Для разработки и других тестовых ситуаций вы можете указать другой IP-адрес для имени хоста, чем тот, который использовался бы в противном случае, с помощью curl --resolve
вариант:
curl --resolve www.example.org:80:127.0.0.1 http://www.example.org/
Номер порта
Каждый поддерживаемый curl протокол работает с номером порта по умолчанию, будь то TCP или, в некоторых случаях, UDP. Обычно вам не нужно принимать это во внимание, но иногда вы запускаете тестовые серверы на других портах или подобных. Затем вы можете указать номер порта в URL-адресе с двоеточием и номером сразу после имени хоста. Например, при выполнении HTTP на порт 1234:
завиток http://www.example.org:1234/
Номер порта, который вы указываете в URL-адресе, — это номер, который сервер использует для предоставления своих услуг. Иногда вы можете использовать прокси-сервер, и тогда вам может потребоваться указать номер порта этого прокси-сервера отдельно от того, какой curl должен подключиться к серверу. Например, при использовании HTTP-прокси на порту 4321:
curl --proxy http://proxy.example.org:4321 http://remote.example.org/
Имя пользователя и пароль
Для некоторых служб требуется HTTP-аутентификация, после чего вам необходимо указать имя и пароль, которые затем передаются на удаленный сайт различными способами в зависимости от используемого протокола аутентификации.
Вы можете либо вставить пользователя и пароль в URL-адрес, либо указать их отдельно:
curl http://user:[email protected]/
или
curl -u пользователь: пароль http://example. org/
Обратите внимание, что этот вид HTTP-аутентификации не является тем, что обычно делается и запрашивается ориентированными на пользователя веб-сайтами в наши дни. Вместо этого они, как правило, используют формы и файлы cookie.
Часть пути
Часть пути просто отправляется на сервер, чтобы запросить отправку связанного ответа. Путь — это то, что находится справа от косой черты, следующей за именем хоста и, возможно, номером порта.
GET
Самый простой и наиболее распространенный запрос/операция, выполняемая с использованием HTTP, — это ПОЛУЧИТЬ URL-адрес. Сам URL-адрес может относиться к веб-странице, изображению или файлу. Клиент отправляет запрос GET на сервер и получает запрошенный документ. Если ввести в командной строке
curl https://curl.se
вы получаете веб-страницу, возвращенную в окно терминала. Весь HTML-документ, который содержит этот URL-адрес.
Все ответы HTTP содержат набор заголовков ответа, которые обычно скрыты, используйте curl’s --включите параметр
( -i
), чтобы отобразить их, а также остальную часть документа.
HEAD
Вы можете запросить у удаленного сервера ТОЛЬКО заголовки, используя параметр --head
( -I
), который заставит curl выдать запрос HEAD. В некоторых особых случаях серверы отвергают метод HEAD, в то время как другие все еще работают, что вызывает особое раздражение.
Метод HEAD определен и сделан таким образом, что сервер возвращает заголовки точно так же, как и для GET, но без тела. Это означает, что вы можете увидеть Content-Length:
в заголовках ответа, но в ответе HEAD не должно быть фактического тела.
Одна командная строка curl может содержать один или несколько URL-адресов. Наиболее распространенным случаем, вероятно, является использование одного, но вы можете указать любое количество URL-адресов. Да любой. Без ограничений. Затем вы будете получать запросы, повторяющиеся снова и снова для всех заданных URL-адресов.
Пример, отправьте два запроса GET:
curl http://url1.example.com http://url2. example.com
Если вы используете --data
для POST на URL-адрес, использование нескольких URL-адресов означает, что вы отправляете один и тот же POST на все указанные URL-адреса.
Пример, отправьте два сообщения POST:
curl --data name=curl http://url1.example.com http://url2.example.com
Иногда вам нужно работать с несколькими URL-адресами в одной командной строке и использовать разные методы HTTP для каждого. Для этого вам понравится опция --next
. По сути, это разделитель, который отделяет несколько вариантов от следующего. Все URL до --next
получит тот же метод и объединит все данные POST в один.
Когда curl достигает --next
в командной строке, он как бы сбрасывает метод и данные POST и разрешает новый набор.
Возможно, это лучше всего показать на нескольких примерах. Чтобы отправить сначала HEAD, а затем GET:
curl -I http://example.com --next http://example.com
Чтобы сначала отправить POST, а затем GET:
curl -d score=10 http://example. com/post.cgi --next http://example.com/results.html
Объяснение форм
Формы — это общий способ, которым веб-сайт может представить HTML-страницу с полями, в которые пользователь может ввести данные, а затем нажать кнопку «ОК» или «Отправить», чтобы эти данные были отправлены на сервер. . Затем сервер обычно использует отправленные данные, чтобы решить, как действовать. Например, использование введенных слов для поиска в базе данных или добавление информации в систему отслеживания ошибок, отображение введенного адреса на карте или использование информации в качестве подсказки для входа в систему, подтверждающей, что пользователю разрешено видеть, о чем идет речь. чтобы увидеть.
Конечно, на стороне сервера должна быть какая-то программа для приема отправляемых вами данных. Вы не можете просто изобрести что-то из воздуха.
GET
GET-форма использует метод GET, как указано в HTML, например:
В вашем любимом браузере эта форма появится с текстовым полем для заполнения и кнопкой «ОК». Если вы заполните ‘1905’ и нажмите кнопку OK, после чего ваш браузер создаст новый URL-адрес для вас. URL-адрес получит junk.cgi?birthyear=1905&press=OK
, добавленный к части пути предыдущего URL-адреса.
Если исходная форма была видна на странице www.example.com/when/birth.html
, вторая страница, которую вы получите, станет www.example.com/when/junk.cgi?birthyear=1905&press= ОК
.
Так работает большинство поисковых систем.
Чтобы заставить curl сделать сообщение формы GET для вас, просто введите ожидаемый созданный URL:
curl "http://www.example.com/when/junk.cgi?birthyear=1905&press=OK"
POST
Метод GET отображает все имена полей ввода в поле URL вашего браузера. Как правило, это хорошо, когда вы хотите добавить эту страницу в закладки с вашими данными, но это очевидный недостаток, если вы ввели секретную информацию в одно из полей или если имеется большое количество полей, создающих длинный и нечитаемый URL.
Затем протокол HTTP предлагает метод POST. Таким образом, клиент отправляет данные отдельно от URL-адреса, и поэтому вы не увидите их в поле URL-адреса.
Форма будет похожа на предыдущую:
И чтобы использовать curl для публикации этой формы с теми же данными, что и раньше, мы могли бы сделать это так:
curl --data "birthyear=1905&press=%20OK%20" http://www .example.com/when/junk.cgi
Этот тип POST будет использовать Content-Type application/x-www-form-urlencoded
и является наиболее широко используемым типом POST.
Данные, которые вы отправляете на сервер, ДОЛЖНЫ уже быть правильно закодированы, curl не сделает этого за вас. Например, если вы хотите, чтобы данные содержали пробел, вам нужно заменить этот пробел на %20
и т. д. Несоблюдение этого правила, скорее всего, приведет к тому, что ваши данные будут получены неправильно и испорчены.
Последние версии curl могут на самом деле кодировать данные POST для вас, например:
curl --data-urlencode "name=I am Daniel" http://www.example.com
Если вы повторите --data
несколько раз в командной строке, curl объединит все заданные фрагменты данных и поместит символы и
между каждым сегментом данных.
Загрузка файла POST
Еще в конце 1995 года был определен дополнительный способ отправки данных через HTTP. Это задокументировано в RFC 1867, поэтому этот метод иногда называют RFC1867-posting.
Этот метод в основном предназначен для лучшей поддержки загрузки файлов. Форма, позволяющая пользователю загрузить файл, может быть написана в HTML следующим образом:
Это ясно показывает, что Content-Type, который должен быть отправлен, имеет значение multipart/form-data
.
Чтобы опубликовать сообщение в подобной форме с помощью curl, введите команду, например:
curl --form upload=@localfilename --form press=OK [URL]
Скрытые поля
Распространенным способом передачи информации о состоянии между страницами для приложений на основе HTML является добавление скрытых полей в формы. Скрытые поля уже заполнены, они не отображаются пользователю и передаются так же, как и все остальные поля.
Аналогичный пример формы с одним видимым полем, одним скрытым полем и одной кнопкой отправки может выглядеть так:
Чтобы отправить это с помощью curl, вам не придется думать о том, скрыты поля или нет. Для завивки они все одинаковые:
curl --data "год рождения=1905&press=OK&person=daniel" [URL]
Выясните, как выглядит POST
Когда вы собираетесь заполнить форму и отправить ее на сервер с помощью curl вместо браузера, вы, конечно же, заинтересованы в отправке POST именно так, как это делает ваш браузер.
Простой способ увидеть это — сохранить HTML-страницу с формой на локальном диске, изменить «метод» на GET и нажать кнопку отправки (вы также можете изменить URL-адрес действия, если хотите к).
Затем вы ясно увидите, что данные добавляются к URL-адресу, разделенному символом ?
-буква, как и положено GET-формам.
PUT
Возможно, лучший способ загрузить данные на HTTP-сервер — использовать PUT. Опять же, для этого, конечно, требуется, чтобы кто-то поместил на сервер программу или скрипт, который знает, как получать HTTP-поток PUT.
Поместите файл на HTTP-сервер с помощью curl:
curl --upload-file uploadfile http://www.example.com/receive.cgi
Базовая аутентификация
HTTP-аутентификация — это возможность сообщить серверу ваше имя пользователя и пароль, чтобы он мог проверить, разрешено ли вам выполнять запрос, который вы делаете. Обычная аутентификация, используемая в HTTP (это тип, который curl использует по умолчанию), основана на простом тексте , что означает, что он отправляет имя пользователя и пароль, слегка запутанные, но все еще полностью читаемые любым, кто прослушивает сеть между вами и удаленным сервер.
Чтобы указать curl использовать пользователя и пароль для аутентификации:
curl --имя пользователя:пароль http://www.example.com
Другая аутентификация
Для сайта может потребоваться другой метод аутентификации (проверьте заголовки, возвращаемые сервером), а затем --ntlm
, --digest
, --negotiate
или даже --anyauth
могут быть варианты, которые подходят вам.
Аутентификация прокси-сервера
Иногда доступ к HTTP возможен только при использовании прокси-сервера HTTP. Это, кажется, особенно распространено в различных компаниях. Прокси-серверу HTTP может потребоваться собственный пользователь и пароль, чтобы позволить клиенту получить доступ к Интернету. Чтобы указать те, у которых есть curl, запустите что-то вроде:
curl --proxy-user proxyuser:proxypassword curl.se
Если ваш прокси-сервер требует аутентификации с использованием метода NTLM, используйте --proxy-ntlm
, если для этого требуется дайджест, используйте --proxy-digest
.
Если вы используете любую из этих опций пользователя и пароля, но пропускаете часть пароля, curl запросит пароль в интерактивном режиме.
Скрытие учетных данных
Обратите внимание, что при запуске программы ее параметры можно увидеть при просмотре списка запущенных процессов системы. Таким образом, другие пользователи смогут просматривать ваши пароли, если вы передадите их как простые параметры командной строки. Есть способы обойти это.
Стоит отметить, что хотя HTTP-аутентификация работает именно так, многие веб-сайты не будут использовать эту концепцию, когда они предоставляют логины и т. д. См. главу «Вход через Интернет» ниже для получения более подробной информации об этом.
Referer
HTTP-запрос может включать поле «referer» (да, оно написано с ошибкой), которое можно использовать, чтобы определить, с какого URL-адреса клиент перешел к этому конкретному ресурсу. Некоторые программы/скрипты проверяют поле реферера запросов, чтобы убедиться, что они не приходят с внешнего сайта или неизвестной страницы. Хотя это глупый способ проверить что-то, что так легко подделать, многие скрипты все еще делают это. Используя curl, вы можете поместить все, что хотите, в поле referer и, таким образом, легче обмануть сервер, заставив его обслужить ваш запрос.
Используйте curl для установки поля реферера с помощью:
curl --referer http://www.example.com http://www.example.com
User Agent
Подобно полю referer, все HTTP-запросы могут устанавливать поле User-Agent. Он указывает, какой пользовательский агент (клиент) используется. Многие приложения используют эту информацию, чтобы решить, как отображать страницы. Глупые веб-программисты пытаются создавать разные страницы для пользователей разных браузеров, чтобы они выглядели как можно лучше для их конкретных браузеров. Обычно они также используют различные виды JavaScript и т. д.
Иногда вы увидите, что получение страницы с помощью curl не вернет ту же страницу, которую вы видите при получении страницы с помощью вашего браузера. Тогда вы знаете, что пришло время установить поле User Agent, чтобы обмануть сервер, заставив его думать, что вы один из этих браузеров.
Чтобы curl выглядел как Internet Explorer 5 на компьютере с Windows 2000:
curl --user-agent "Mozilla/4.0 (совместимый; MSIE 5.01; Windows NT 5.0)" [URL]
Или почему бы не выглядеть так, будто вы используете Netscape 4.73 на старой Linux-системе:
curl --user-agent "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" [URL]
Перенаправления
Когда ресурс запрашивается с сервера, ответ от сервера может включать подсказку о том, куда браузер должен перейти, чтобы найти эту страницу, или новую страницу, содержащую вновь сгенерированный вывод. Заголовок, сообщающий браузеру о перенаправлении, имеет вид Location:
.
Curl не следует за заголовками Location:
по умолчанию, но просто отображает такие страницы так же, как отображает все ответы HTTP. Однако у него есть опция, которая заставит его попытаться следовать Расположение:
указателей.
Чтобы указать curl следовать по местоположению:
curl --location http://www.example.com
Если вы используете curl для POST на сайт, который немедленно перенаправляет вас на другую страницу, вы можете безопасно использовать --location
( -L
) и --data
/ --form
вместе. Curl будет использовать POST только в первом запросе, а затем вернется к GET в следующих операциях.
Другие перенаправления
Браузеры обычно поддерживают как минимум два других способа перенаправления, которые не поддерживает curl: во-первых, html может содержать мета-тег обновления, который просит браузер загрузить определенный URL-адрес через заданное количество секунд, или он может использовать JavaScript для этого.
Основы работы с файлами cookie
Веб-браузеры осуществляют «управление состоянием на стороне клиента» с помощью файлов cookie. Файлы cookie — это просто имена с соответствующим содержимым. Файлы cookie отправляются клиенту сервером. Сервер сообщает клиенту, для какого пути и имени хоста он хочет, чтобы файл cookie был отправлен обратно, а также отправляет дату истечения срока действия и еще несколько свойств.
Когда клиент связывается с сервером с именем и путем, ранее указанными в полученном файле cookie, клиент отправляет файлы cookie и их содержимое обратно на сервер, если, конечно, срок их действия не истек.
Многие приложения и серверы используют этот метод для соединения серии запросов в один логический сеанс. Чтобы иметь возможность использовать curl в таких случаях, мы должны иметь возможность записывать и отправлять файлы cookie так, как их ожидает веб-приложение. Так же, как браузеры работают с ними.
Параметры cookie
Самый простой способ отправить несколько файлов cookie на сервер при получении страницы с curl — добавить их в командную строку, например:
curl --cookie "name=Daniel" http://www. пример.com
Файлы cookie отправляются как обычные заголовки HTTP. Это практично, поскольку позволяет curl записывать файлы cookie, просто записывая заголовки. Запишите файлы cookie с помощью curl, используя параметр --dump-header
( -D
), например:
curl --dump-header headers_and_cookies http://www.example.com
(Обратите внимание, что описанная ниже опция --cookie-jar
является лучшим способом хранения файлов cookie.)
Curl имеет встроенный полнофункциональный механизм анализа файлов cookie, который можно использовать, если вы хотите повторно сервера и использовать файлы cookie, которые были сохранены из предыдущего соединения (или созданы вручную, чтобы заставить сервер поверить, что у вас было предыдущее соединение). Чтобы использовать ранее сохраненные файлы cookie, вы запускаете curl, например:
curl --cookie store_cookies_in_file http://www.example.com
«Cookie Engine» Curl включается при использовании параметра --cookie
. Если вы хотите, чтобы curl понимал только полученные файлы cookie, используйте --cookie
с несуществующим файлом. Например, если вы хотите, чтобы curl понимал файлы cookie со страницы и следовал по местоположению (и, таким образом, возможно, отправлял обратно полученные файлы cookie), вы можете вызвать его следующим образом:
curl --cookie nada --location http://www. пример.com
Curl может читать и записывать файлы cookie, которые используют тот же формат файлов, который когда-то использовали Netscape и Mozilla. Это удобный способ обмена файлами cookie между сценариями или вызовами. Переключатель --cookie
( -b
) автоматически определяет, является ли данный файл таким файлом cookie, и анализирует его, а с помощью параметра --cookie-jar
( -c
) вы делаете curl записать новый файл cookie в конце операции:
curl --cookie cookies.txt --cookie-jar newcookies.txt http://www.example.com
HTTPS защищен HTTP
Существует несколько способов безопасной передачи HTTP. На сегодняшний день наиболее распространенным протоколом для этого является то, что обычно известно как HTTPS, HTTP через SSL. SSL шифрует все данные, отправляемые и получаемые по сети, что затрудняет шпионаж конфиденциальной информации для злоумышленников.
SSL (или TLS, как называется текущая версия стандарта) предлагает набор расширенных функций для безопасной передачи по протоколу HTTP.
Curl поддерживает зашифрованные выборки, если он создан для использования библиотеки TLS, и его можно настроить для использования одной из довольно большого набора библиотек — curl -V
покажет, для какого из них был создан ваш curl (если есть!). Чтобы получить страницу с HTTPS-сервера, просто запустите curl, например:
curl https://secure.example.com
Сертификаты
В мире HTTPS вы используете сертификаты для подтверждения того, что вы являетесь тем, за кого себя выдаете, в дополнение к обычным паролям. Curl поддерживает клиентские сертификаты. Все сертификаты заблокированы парольной фразой, которую необходимо ввести, прежде чем curl сможет использовать сертификат. Парольную фразу можно указать в командной строке или, если нет, ввести интерактивно, когда curl запрашивает ее. Используйте сертификат с завитком на HTTPS-сервере, например:
curl --cert mycert.pem https://secure.example.com
curl также пытается проверить, является ли сервер тем, за кого себя выдает, путем проверки сертификата сервера по локально хранящемуся пакету сертификатов ЦС. Неудачная проверка приведет к тому, что curl откажет в соединении. Затем вы должны использовать --insecure
( -k
), если вы хотите, чтобы curl игнорировал, что сервер не может быть проверен.
Подробнее о проверке сертификата сервера и пакетах сертификатов ca можно прочитать в SSLCERTS
документ.
Иногда вы можете получить собственное хранилище сертификатов ЦС, и тогда вы можете указать curl использовать его для проверки сертификата сервера:
curl --cacert ca-bundle.pem https://example.com/
Делая необычные вещи, вам может понадобиться добавить или изменить элементы одного запроса curl.
Например, вы можете изменить метод POST на PROPFIND
и отправить данные как Content-Type: text/xml
(вместо стандартного Content-Type
) следующим образом:
curl --data "" --header "Content-Type: text/xml" --request PROPFIND example.com
Вы можете удалить заголовок по умолчанию, предоставив его без содержимого. Например, вы можете испортить запрос, отрезав заголовок Host:
:
curl --header "Host:" http://www.example.com
Таким же образом можно добавить заголовки. Вашему серверу может потребоваться заголовок Destination:
, и вы можете добавить его:
curl --header "Destination: http://nowhere" http://example.com
Подробнее об измененных методах
Следует отметить, что curl самостоятельно выбирает, какие методы использовать, в зависимости от запрашиваемого действия. -d
будет выполнять POST, -I
будет выполнять HEAD и так далее. Если вы используете опцию --request
/ -X
, вы можете изменить выбор ключевого слова метода curl, но вы не измените поведение curl. Это означает, что если вы, например, используете -d «данные» для выполнения POST, вы можете изменить метод на PROPFIND
с -X
и curl все равно будет думать, что отправляет POST . Вы можете изменить обычный метод GET на метод POST, просто добавив -X POST
в командную строку, например:
curl -X POST http://example.org/
… но curl по-прежнему будет думать и действовать так, как если бы он отправил GET, поэтому он не будет отправлять тело запроса и т. д.
Некоторые приемы входа в систему Итак, вот краткое изложение того, как работает подавляющее большинство всех форм входа и как войти в них с помощью curl.
Также можно отметить, что для того, чтобы сделать это должным образом в автоматическом режиме, вам, безусловно, потребуется создавать сценарии и выполнять несколько вызовов curl и т. д.
Во-первых, серверы в основном используют файлы cookie для отслеживания состояния входа клиента в систему. , поэтому вам нужно будет перехватывать файлы cookie, которые вы получаете в ответах. Кроме того, многие сайты также устанавливают специальный файл cookie на странице входа (чтобы убедиться, что вы попали туда через их страницу входа), поэтому вы должны иметь привычку сначала получать страницу формы входа для захвата установленных там файлов cookie.
Некоторые веб-системы входа в систему содержат различное количество JavaScript, и иногда они используют такой код для установки или изменения содержимого файлов cookie. Возможно, они делают это, чтобы предотвратить запрограммированный вход в систему, как это руководство описывает, как… В любом случае, если чтения кода недостаточно, чтобы позволить вам повторить поведение вручную, захват HTTP-запросов, сделанных вашими браузерами, и анализ отправленных файлов cookie обычно рабочий метод, чтобы решить, как сократить потребность в JavaScript.
Фактически для входа в систему, многие сайты заполняют случайные/сеансовые или иным образом тайно сгенерированные скрытые теги, и вам может потребоваться сначала захватить HTML-код для формы входа и извлечь все скрытые поля, чтобы иметь возможность делать правильный логин POST. Помните, что содержимое должно быть закодировано в URL-адресе при отправке обычным POST.
Некоторые приемы отладки
Много раз, когда вы запускаете curl на сайте, вы замечаете, что сайт не отвечает на ваши запросы curl так же, как на запросы вашего браузера.
Затем вам нужно начать делать ваши запросы curl более похожими на запросы вашего браузера:
Используйте параметр
--trace-ascii
для хранения полных подробных журналов запросов для облегчения анализа и лучшего пониманияУбедитесь, что вы проверяете и используете файлы cookie, когда это необходимо (как для чтения с помощью
--cookie
, так и для записи с помощью--cookie-jar
)Установить пользовательский агент (с
-A
) на единицу, как это делает недавний популярный браузерУстановить ссылку (с
-E
) так же, как это установлено браузеромЕсли вы используете POST, убедитесь, что вы отправляете все поля и в том же порядке, что и браузер.
Проверьте, что делают браузеры
Хорошим помощником, чтобы убедиться, что вы все делаете правильно, являются инструменты разработчиков веб-браузеров, которые позволяют вам просматривать все заголовки, которые вы отправляете и получаете (даже при использовании HTTPS).
Более простой подход заключается в захвате HTTP-трафика в сети с помощью таких инструментов, как Wireshark или tcpdump, и проверке того, какие заголовки были отправлены и получены браузером. (HTTPS заставляет вас использовать SSLKEYLOGFILE
для этого.)
веб-службы — HTTP POST и GET с использованием cURL в Linux
*nix предоставляет небольшую приятную команду, которая значительно облегчает нашу жизнь.
GET:
с JSON:
curl -i -H "Принять: application/json" -H "Content-Type: application/json" -X GET http://hostname/resource
с XML:
curl -H "Accept: application/xml" -H "Content-Type: application/xml" -X GET http://hostname/resource
POST:
Для публикации данных:
curl --data "param1=value1¶m2=value2" http://hostname/resource
Для загрузки файла:
curl --form "fileupload=@filename. txt" http://hostname/resource
RESTful HTTP Post:
curl -X POST -d @filename http://hostname/resource
Для входа на сайт (авторизация):
curl -d "username=admin&password=admin&submit=Login" --dump-header headers http://localhost/Login curl -L -b заголовки http://localhost/
ПРОЙТИКАЯ ПРИНЦИАЦИЯ КУРЛ Результаты:
для JSON:
Если вы используете NPM
и Nodejs
, вы можете установить JSON
.
Использование:
curl -i -H "Принять: application/json" -H "Content-Type: application/json" -X GET http://hostname/resource | json
Если вы используете pip
и python
, вы можете установить pjson
, выполнив эту команду:
pip install pjson
Использование:
curl -i -H "Принять: application/json" -H "Content-Type: application/json" -X GET http://hostname/resource | писон
Если вы используете Python 2.