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).