Статья Примеры команд cURL: часть вторая урока cURL

Первая часть здесь: «Урок cURL: основы использования и пара полезных трюков».

cURL — это пакет программного обеспечения, состоящий из утилиты командной строки и библиотеки для передачи данных с использованием синтаксиса URL.

cURL поддерижвает множество протоколов, среди них DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet и TFTP.

Загрузить отдельный файл
Следующая команда получит содержимое URL и отобразит его в стандартном выводе (т. е. в вашем терминале).
Код:
curl https://mi-al.ru/
Чтобы сохранить вывод в файл, сделайте редирект, как показано ниже. Это также приведёт к показу некоторой дополнительной информации по статистике загрузки.
Код:
curl https://mi-al.ru/ > mi-al.htm
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 14378    0 14378    0     0   5387      0 --:--:--  0:00:02 --:--:--  5387
Сохранение вывода cURL в файл
Мы можем сохранить результат команды curl в файл, используя опции -o/-O.
  • -o (o нижнего регистра) результат будет сохранён в файле, заданном в командной строке
  • -O (O верхнего регистра) имя файла будет взято из URL и будет использовано для сохранения полученных данных.
Код:
$ curl -o mygettext.html http://www.gnu.org/software/gettext/manual/gettext.html
Теперь будет сохранена страница gettext.html в файле с названием ‘mygettext.html’. Когда curl запущена с опцией -o, она отображает шкалу прогресса загрузки следующим образом.
Код:
 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
66 1215k   66  805k    0     0  33060      0  0:00:37  0:00:24  0:00:13 45900
100 1215k  100 1215k    0     0  39474      0  0:00:31  0:00:31 --:--:-- 68987
Когда вы используете curl -O (O верхнего регистра), она сама по себе сохранит содержимое в файл под названием ‘gettext.html’ на локальной машине.
Код:
$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html
Примечание: Когда curl должна писать данные в терминал, она отключает шкалу прогресса, чтобы не было путаницы в напечатанных данных. Мы можем исользовать ‘>’|’-o’|’-O’ опции для передачи результатов в файл.

Выборка нескольких файлов одновременно
Мы можем загрузить несколько файлов за один раз, задав все URL в командной строке.
Код:
curl -O URL1 -O URL2
Команда ниже загрузит оба index.html и gettext.html и сохранит их с теми же именами в текущей директории.
Код:
curl -O http://www.gnu.org/software/gettext/manual/html_node/index.html -O http://www.gnu.org/software/gettext/manual/gettext.html
Пожалуйста, обратите внимание, когда мы загружаем несколько файлов с одного сервера как показано выше, curl попытается повторно использовать соединение.

Следуем за HTTP Location в заголовках с опцией -L
По умолчанию, CURL не следует за HTTP Location в заголовках (редиректы). Когда запрошенная веб-страница перемещена в другое место, то соответствующий ответ будет передан в заголовках HTTP Location.
Например, когда кто-то печатает google.com в строке браузера из своей страны, они автоматически будут перенаправлены на ‘google.co.xx’. Это делается на основе заголовка HTTP Location как показано ниже.
Код:
curl https://www.google.com/?gws_rd=ssl
HTML:
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.co.th/?gws_rd=cr&amp;ei=1enNVbHAGI6zuQSl9I64CA">here</A>.
</BODY></HTML>
Приведённый выше вывод говорит, что запрашиваемый документ был перемещён в ‘ .
Вы можете указать curl следовать редиректам, это делается с использованием опции -L как показано ниже. Теперь будет загружен исходный код html с .
Код:
curl -L https://www.google.com/?gws_rd=ssl
Вообновление предыдущей закачки

Используя опцию -C вы можете продолжить закачку, которая была остановлена по каким-либо причинам. Это будет полезным при обрыве загрузки больших файлов.
Если мы говорим ‘-C -’, то curl будет искать, с какого места возобновить загрузку. Мы также можем задать ‘-C <смещение>’. Заданное смещение байт будет пропущено от начала исходного файла.
Начните большую загрузку с curl и нажмите Ctrl-C для остановки посреди закачки.
Код:
$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html
##############             20.1%
Закачка была остановлена на 20.1%. Используя “curl -C -” мы можем продолжить загрузку с того места, где мы остановились. Теперь загрузка продолжиться с 20.1%.
Код:
curl -C - -O http://www.gnu.org/software/gettext/manual/gettext.html
###############            21.1%
Ограничение скорости передачи данных
Вы можете ограничить величину скорости передачи данных опцией –limit-rate. Вы можете передать максимальную скорость в качестве аргумента.
Код:
$ curl --limit-rate 1000B -O http://www.gnu.org/software/gettext/manual/gettext.html
Команда выше ограничит скорость передачи на 1000 байт/секунду. curl может использовать скорость выше на пиках. Но средняя скорость будет примерно 1000 байт/секунду.
Ниже показан индикатор прогресса для представленной выше команды. Вы можете видеть, что текущая скорость в районе 1000 байт.
Код:
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  1 1215k    1 13601    0     0    957      0  0:21:40  0:00:14  0:21:26   999
  1 1215k    1 14601    0     0    960      0  0:21:36  0:00:15  0:21:21   999
  1 1215k    1 15601    0     0    962      0  0:21:34  0:00:16  0:21:18   999
Загрузить файл только если он изменён до/после заданного времени
Вы можете получить файлы, которые были изменены после определённого времени, используя опцию -z в curl. Это будет работать и для FTP и для HTTP.
Код:
$ curl -z 20-Aug-14
Команда выше загрузит yy.html только если он изменялся позднее чем заданная дата и время.
Код:
$ curl -z -20-Aug-14
Команда выше загрузит файл file.html, если он изменялся до заданной даты и времени. Наберите ‘man curl_getdate’ чтобы узнать больше о различных поддерживаемых синтаксисах для выражений даты.

Прохождение аутентификации HTTP в cURL
Иногда веб-сайты требуют имя пользователя и пароль для просмотра их содержимого. С помощью опции -u вы можете передать эти учётные данные из cURL на веб-сервер как показано ниже.
Код:
$ curl -u username:password URL
Примечание: По умолчанию curl использует базовую HTTP аутентификацию. Мы можем задать иные методы аутентификации используя –ntlm | –digest.

Загрузка файлов с FTP сервера
cURL может также использоваться для загрузки файлов с FTP серверов. Если заданный FTP путь является директорией, то по умолчанию будет выведен список файлов в ней.
Код:
$ curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/xss.php
Команда выше загрузит файл xss.php с ftp-сервера и сохранит его в локальной директории.
Код:
$ curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/
Здесь URL отсылает к директории. Следовательно, cURL сделает список файлов и директорий по заданному URL адресу.

Список/Загрузка с использованием диапазонов.
CURL поддерживает диапазоны заданные в URL. Когда дан диапазон, будут загружены соответствующие файлы внутри этого диапазона. Это будет полезным при загрузке пакетов с сайтов FTP зеркал.
Код:
$ curl ftp://ftp.uk.debian.org/debian/pool/main/[a-z]/
Команда выше сделает список всех пакетов в диапазоне a-z в терминале.

Выгрузка файлов на FTP-сервер
Curl также может использоваться для выгрузки на FTP-сервер с опцией -T.
Код:
$ curl -u ftpuser:ftppass -T myfile.txt ftp://ftp.testserver.com
Команда выше выгрузит файл с именем myfile.txt на FTP-сервер. Вы можете также выгрузить несколько файлов за один раз используя диапазоны.
Код:
$ curl -u ftpuser:ftppass -T "{file1,file2}" ftp://ftp.testserver.com
Опционально мы можем использовать “.” для получения из стандартного ввода и передачи его на удалённую машину.
Код:
$ curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt
Команда выше получит вывод от пользователя из стандартного ввода и сохранит содержимое на ftp-сервере под именем ‘myfile_1.txt’.
Вы можете задать ‘-T’ для каждого URL, и каждая пара адрес-файл будут определять что куда выгружать

Больше информации с увеличением вербальности и опцией трассировки
Вы можете узнать что происходит, используя опцию -v. Опция -v включает вербальный режим и будет печатать подробности.
Код:
curl -v https://www.google.co.th/?gws_rd=ssl
Команда выше выведет следующее
Код:
* Rebuilt URL to: https://www.google.co.th/?gws_rd=ssl
* Hostname was NOT found in DNS cache
*   Trying 27.123.17.49...
* Connected to www.google.co.th (27.123.17.49) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.38.0
> Host: www.google.co.th
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Fri, 14 Aug 2015 23:07:20 GMT
< Expires: -1
< Cache-Control: private, max-age=0
< Content-Type: text/html; charset=windows-874
< P3P: CP="This is not a P3P policy! See https://support.google.com/accounts/answer/151657?hl=en for more info."
* Server gws is not blacklisted
< Server: gws
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN
< Set-Cookie: PREF=ID=1111111111111111:FF=0:TM=1439593640:LM=1439593640:V=1:S=FfuoPPpKbyzTdJ6T; expires=Sun, 13-Aug-2017 23:07:20 GMT; path=/; domain=.google.co.th
...
...
...
Если вам нужно больше детальной информации, тогда вы можете использовать опцию –trace. Опция –trace включит полный дамп трассировки всех входящих/исходящих данных для заданного файла
Код:
=> Send header, 169 bytes (0xa9)
0000: 47 45 54 20 2f 20 48 54 54 50 2f 31 2e 31 0d 0a GET / HTTP/1.1..
0010: 55 73 65 72 2d 41 67 65 6e 74 3a 20 63 75 72 6c User-Agent: curl
..
0060: 2e 32 2e 33 2e 34 20 6c 69 62 69 64 6e 2f 31 2e .2.3.4 libidn/1.
0070: 31 35 20 6c 69 62 73 73 68 32 2f 31 2e 32 2e 36 15 libssh2/1.2.6
0080: 0d 0a 48 6f 73 74 3a 20 77 77 77 2e 67 6f 6f 67 ..Host: www.goog
0090: 6c 65 2e 63 6f 2e 69 6e 0d 0a 41 63 63 65 70 74 le.co.xx..Accept
00a0: 3a 20 2a 2f 2a 0d 0a 0d 0a                      : */*....
== Info: HTTP 1.0, assume close after body
<= Recv header, 17 bytes (0x11)
0000: 48 54 54 50 2f 31 2e 30 20 32 30 30 20 4f 4b 0d HTTP/1.0 200 OK.
0010: 0a
Опции увеличения вербальности и трассировки пригодятся, когда curl терпит неудачу по каким-то причинам и мы не знаем почему.

Получаем определение слова и его перевод с использованием протокола DICT
Посмотреть список доступных словарей можно так:
Код:
curl dict://dict.org/show:db
Получить перевод слова с английского на русский можно так:
Код:
curl dict://dict.org/d:girl:fd-eng-rus
220 pan.alephnull.com dictd 1.12.1/rf on Linux 3.14-1-amd64 <auth.mime> <1545703.32623.1439595012@pan.alephnull.com>
250 ok
150 1 definitions retrieved
151 "girl" fd-eng-rus "English-Russian FreeDict Dictionary ver. 0.3"
girl /gəːl/
девушка
.
250 ok [d/m/c = 1/0/8; 0.000r 0.000u 0.000s]
221 bye [d/m/c = 0/0/0; 0.000r 0.000u 0.000s]
Больше информации по DICT можно найти прочитав .

Использование прокси для загрузки файла
Мы можем указать cURL использовать прокси для определённых операций, это делается опцией -x. Нам нужно задать хост и порт прокси.
Код:
$ curl -x proxysever.test.com:3128 https://www.google.co.in/?gws_rd=ssl
Отправка электронной почты с использованием протокола SMTP в curl
cURL также может быть использована для отправки электронной почты по протоколу SMTP. Вам нужно указать адрес от кого, адрес кому и IP адрес почтового сервера как показано ниже.
Код:
$ curl --mail-from blah@test.com --mail-rcpt foo@test.com smtp://mailserver.com
Когда команда будет введена, начнётся ожидание введения пользователем данных для письма. Когда вы закончите набирать сообщение, напечатайте . (точку) в качестве последней строки, и письмо будет немедленно отправлено.
Код:
Subject: Testing
This is a test mail
.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!