Curl помогает работать с данными, размещенными в Web

.

Устанавливаем Curl

Curl входит в состав многих дистрибутивов Unix. Имеются двоичные файлы и исходные тексты для большинства других операционных систем. Даже программисты, работающие с открытым PHP: Hypertext Preprocessor language (PHP), могут использовать Curl для более безопасного доступа к Web-контенту непосредственно из PHP-сценариев.

Для работы Curl с Web-узлами Secure Sockets Layer (SSL) необходим пакет OpenSSL. Существует две версии Curl: одна с SSL, другая без SSL. SSL надежно защищает данные, поэтому я рекомендую устанавливать версию SSL.

Прежде чем использовать Curl с функциями SSL, необходимо загрузить из сети и отдельно установить пакет OpenSSL. Двоичные файлы OpenSSL for Windows можно получить с сайта GnuWin32 SourceForge по адресу http://gnuwin32.sourceforge.net/packages/openssl.htm. На этом сайте имеется и много других полезных инструментов, перенесенных в Windows.

Следует загрузить и установить пакет OpenSSL, затем скопировать два DLL-файла в каталог system32:

copy "C:Program
FilesGnuWin32
binlibeay32.dll"
%windir%system32
copy "C:Program
FilesGnuWin32
binlibssl32.dll"
%windir%system32

После этого можно установить Curl. SSL-совместимые двоичные файлы Curl для Windows можно найти по адресу http://curl.haxx.se/latest.cgi?curl=win32-ssl-sspi. Новейшая версия, curl 7.15.0, находится в win32-ssl-sspi.zip, который содержит файл curl.exe и документацию.

После установки Curl следует убедиться в его работоспособности, введя команду

curl http://isc.sans.org/
infocon.txt

Если на экране появится слово green, значит, Curl работает. В приведенном простом примере Curl извлекает статус Infocon из Web-узла Internet Storm Center института SANS. Green означает, что Internet функционирует нормально и серьезных угроз не обнаружено. Если же вместо green на экране появляются слова yellow, orange или red, отложите эту статью и посетите сайт http://isc.sans.org, чтобы узнать о состояниях повышенной опасности в Internet. В случае ошибки проверьте правильность установки Curl.

В сущности, Curl извлекает Web-страницу, а затем выдает исходный текст HTML страницы на консоль. Но возможности утилиты шире. Curl располагает встроенной функцией проверки ошибок. Например, команда

curl http://noserverhere

выдает ошибку Curl: (6) Could not resolve host: noserverhere; Host not found. Коды ошибки можно использовать в сценариях, чтобы проверить доступность Web-страницы или реакцию Web-сервера. Например, если применять Curl для ежедневного извлечения Web-страницы - в частности, суточной статистики Web-узла - то можно дополнить сценарий исходным текстом, отыскивающим коды ошибок. Если Curl выдает код ошибки Curl: (7) couldn't connect to host, то можно немедленно передать предупреждение или сообщение электронной почты.

Извлечение шифрованных данных

Одно из важнейших достоинств Curl - совместимость с SSL. Запрошенные страницы HTTPS передаются через сеть в зашифрованном виде, а затем Curl выводит на экран восстановленный текст. Кроме того, Curl проверяет сертификаты - дату завершения действия сертификата, соответствие имени хост-компьютера хост-имени в сертификате и уровень доверия к корневому сертификату - и предупреждает, если сертификат не совсем корректен. Параметр -cacert позволяет указать определенный файл сертификата. Проверка сертификатов отменяется с помощью параметра -k. Альтернативный метод - использовать параметр -insecure.

Не только для WWW

Возможности Curl шире простой пересылки файлов через Internet. С помощью Curl можно быстро получить список каталогов FTP-сайта:

curl ftp://myftpsite

Чтобы увидеть подкаталоги сайта, следует ввести команду

curl ftp://myftpsite/subdir/

Для загрузки файла из сети достаточно указать в URL имя файла. В следующем примере файл с именем readme.txt загружается прямо из командной строки и отображается на экране:

curl ftp://ftp.microsoft.com/
deskapps/games/readme.txt

Нередко проще подготовить сценарий с Curl для передачи файлов по FTP, чем использовать интерактивно команду FTP.

По умолчанию данные выводятся непосредственно на консоль, но их можно перенаправить в файл с помощью параметров -o и -O. Конечно, двоичные файлы направляются на диск, если не требуется прокручивать двоичный код на экране. Чтобы получить страницу и сохранить ее на диске, следует указать параметр -o. Параметр -O сохраняет полученную страницу в локальном файле, и Curl извлекает имя удаленного документа. Если в URL имя файла не указано, то эта операция закончится неудачей. Если использовать Curl для передачи Web-узлу запроса без имени файла, но нужно сохранить результат в файле, можно указать имя файла в командной строке, например:

curl -o whoisOutputFile
http://www.arin.net/whois/

Аутентификация

Curl обеспечивает Basic, Digest и интегрированный метод аутентификации. В большинстве (но не во всех) сайтах доступ к страницам с аутентификацией на базе форм можно получить с использованием функций отправки Curl, что будет продемонстрировано ниже. Это означает, что можно передать данные формы, в частности, имя пользователя и пароль, на удаленный Web-узел, в Web-странице которого запрошена информация. Для пересылки учетных данных можно использовать параметр -u или вставить их в URL, как традиционно делается в FTP, например:

curl ftp://username:
password@myhtmlsite

С помощью Curl приемы, заимствованные из FTP, можно перенести в HTTP, как в данном примере:

curl http://username:password
@myhtmlsite/default.htm

Curl также обеспечивает доступ к Web-страницам через proxy-сервер. Поэтому его можно настроить на использование proxy-сервера Web для Basic, Digest и NTLM-аутентификации.

Читайте документацию

В данной статье невозможно рассмотреть все многочисленные функции Curl, среди которых загрузка файлов на сервер (-T), просмотр только информации в заголовке HTTP (-I), просмотр всех данных в детальном режиме (-V) и скрытый вывод (-s). Я рекомендую более подробно познакомиться с функциями Curl в руководстве, опубликованном по адресу http://curl.haxx.se/docs.

Пример использования Curl

После знакомства с основами Curl полезно рассмотреть простой пример извлечения данных из Web-узла при заданных входных данных. Построим простой инструмент Whois, который показывает простоту и удобство Curl и демонстрирует процедуру отправки данных на Web-узел с использованием параметра -d. В данном примере Curl посылает IP-адрес на Web-узел Arin Whois, а затем извлекает результаты с этого сайта. Whois отыскивает информацию о владельце IP-адреса.

Перед началом важно исследовать Web-узел, так как в исходном тексте каждого сайта есть индивидуальные особенности, и Curl не всегда одинаково работает с любыми сайтами. Предварительное посещение сайта позволяет собрать необходимую информацию для работы Curl. В данном примере я воспользовался браузером, чтобы посетить Web-узел http://www.arin.net/whois/ и обратил внимание, что на сайте имеется единственное поле ввода данных, в которое посетители вводят интересующий их IP-адрес. Необходимо получить детали этого поля, которое представляет собой часть Web-формы. В данном примере используется Perl-сценарий formfind.pl (http://cool.haxx.se/cvs.cgi/curl/perl/contrib/formfind?rev=HEAD&content-type=text/vnd.viewcvs-markup). Formfind.pl преобразует данные формы в удобные выходные результаты и упрощает ручной поиск данных в HTML. Конечно, для запуска Formfind на компьютере должен быть установлен Perl. Хороший пакет Win32 Perl можно получить на сайте ActiveState ActivePerl по адресу http://www.activestate.com.

Подробно рассмотрим пример. Во-первых, обратимся к сайту, содержащему форму, которая запрашивает информацию:

curl -o whoisOutputFile
http://www.arin.net/whois/

Эта команда извлекает страницу Whois из http://www.arin.net и сохраняет ее в текстовом файле whoisOutputFile, который содержит исходный текст HTML, воспроизводимый браузером при посещении сайта.

Затем необходимо найти и выделить данные формы:

./formfind.pl < whoisOutputFile

Formfind выдает переменные формы и их возможные величины. В приведенном примере выходные результаты имеют довольно простой вид и показаны на Экране 1.


Экран 1. Образец вывода Formfind.

Следует обратить внимание на данные формы Input с именем queryinput. Это текстовое поле, в которое Curl должен послать искомый IP-адрес. Конкретный IP-адрес не имеет значения -- в нашем примере использован адрес Microsoft. При указании параметра -d искомый IP-адрес пересылается в поле queryinput:

curl -d "queryinput=
207.46.133.140"
http://ws.arin.net/cgibin/
whois.pl

Команда Curl с параметром -d отыскивает данные в форме, в данном случае, queryinput, которые представляют собой искомый IP-адрес. При этом поменялся целевой адрес; форма должна передавать в новый URL, который представляет сценарий whois.pl. Новый целевой адрес можно увидеть в выходе formfind на Экране 1.

В данном примере также получен исходный текст HTML ответа Whois, но он скрыт группой тегов HTML. По умолчанию сообщение о статусе Curl показывает размер документа, процент выполнения и скорость пересылки. Выходные данные можно немного расчистить и отфильтровать имя организации, которой принадлежит IP-адрес. Статус Curl можно блокировать с помощью параметра -s. Команду следует выполнять через grep, чтобы получить только OrgName:

curl -s -d "queryinput=
207.46.133.140"
http://ws.arin.net/cgibin/
whois.pl
| grep OrgName

В данном примере выходные результаты показывают, что OrgName - Microsoft Corp.

И наконец, не рекомендуется жестко задавать IP-адрес, поэтому запрос следует поместить внутрь простого сценария с именем arin.bat:

@echo off
curl -k -s -d "queryinput=
%1" http://ws.arin.net/cgibin/
whois.pl | grep OrgName

На Экране 2 показаны выходные результаты, полученные при запуске сценария из командной строки.


Экран 2. Образец вывода arin.bat.

Простота использования Curl

В данной статье показано, как Curl извлекает и анализирует данные из удаленного Web-узла, и позволяет просматривать и управлять Web-данными из командной строки.

Curl располагает набором параметров командной строки. С помощью команды -help можно быстро получить справку по конкретным параметрам. Например, с помощью

curl -help | grep proxy

можно найти все параметры, относящиеся к proxy.

Несмотря на простоту использования, инструмент Curl подходит не всегда. Например, чтобы исследовать Web-узел и извлечь несколько файлов, можно воспользоваться запускаемой из командной строки Internet-утилитой захвата файлов wget, которая поддерживает универсальные символы. Но Wget мы рассмотрим в другой статье.

Джефф Феллинг (jeff@blackstatic.com) - директор по информационной безопасности компании aQuantive. Автор книги IT Administrator's Top 10 Introductory Scripts for Windows (издательство Charles River Media).