Инструменты командной строки для веб-разработчика. Пересылка Web-файлов из командной строки Curl скачать страницу в файл

c URL очень полезный инструмент командной строки для передачи данных от или к серверу. Curl поддерживает различные протоколы, такие как FILE, HTTP, HTTPS, IMAP, IMAPS, LDAP, DICT, LDAPS, TELNET, FTPS, GOPHER, RTMP, RTSP, SCP, SFTP, POP3, POP3S, SMB, SMBS, SMTP, SMTPS, и TFTP.

cURL может быть использован самыми различными и интересными способами. С помощью этого инструмента вы можете скачать, загрузить файлы и управлять ими, проверить свой адрес электронной почты, или даже обновлять свой статус на некоторых веб – сайтах социальных медиа или проверить погоду на улице. В этой статье мы рассмотрим пять наиболее полезных и основных видов использования инструмента cURL на любой .

1. Проверьте URL

Одним из наиболее распространенных и простейших применений cURL печатает саму команду, а затем URL, который вы хотите проверить

Curl https://domain.ru

Эта команда будет отображать содержимое URL на вашем терминале

2. Сохраните вывод URL в файл

Curl -o website https://domain.ru % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 41793 0 41793 0 0 275k 0 --:--:-- --:--:-- --:--:-- 2.9M

В этом примере, вывод будет сохранен в файл с именем ‘website’ в текущем рабочем каталоге.

3. Загрузка файлов с помощью Curl

Вы можете скачивать файлы при помощи Curl, путем добавления опции -o к команде. Он используется для сохранения файлов на локальном сервере с теми же именами, как и на удаленном сервере

Curl -O https://domain.ru/file.zip

В этом примере архив ‘file.zip’ будет загружен в текущий рабочий каталог.

Вы также можете загрузить файл с другим именем, добавив опцию -o к cURL.

Curl -o archive.zip https://domain.ru/file.zip

Таким образом, архив ‘file.zip’ будет загружен и сохранен как ‘Archive.zip’.

cURL может быть также использован для загрузки нескольких файлов одновременно, как показано в приведенном ниже примере

Curl -O https://domain.ru/file.zip -O https://domain.com/file2.zip

Curl также можно использовать для загрузки файлов надежно через SSH с помощью следующей команды

Curl -u user sftp://server.domain.ru/path/to/file

Обратите внимание, что вы должны использовать полный путь к файлу, который требуется загрузить

4. Взять информацию из заголовка HTTP веб-сайта

Вы можете легко получить информацию заголовка HTTP из любого веб-сайта, добавив опцию -I (‘i’) к cURL.

Curl -I http://domain.ru HTTP/1.1 200 OK Date: Sun, 16 Oct 2016 23:37:15 GMT Server: Apache/2.4.23 (Unix) X-Powered-By: PHP/5.6.24 Connection: close Content-Type: text/html; charset=UTF-8

5. Доступ к FTP-серверу

Чтобы получить доступ к FTP-серверу с помощью Curl, надо использовать следующую команду

Curl ftp://ftp.domain.ru --user username:password

Curl будет подключаться к FTP-серверу и выведет список всех файлов и каталогов в домашнем каталоге пользователя

Вы можете скачать файл с помощью FTP

Curl ftp://ftp.domain.ru/file.zip --user username:password

и загрузить файл на сервер FTP

Curl -T file.zip ftp://ftp.domain.ru/ --user username:password

Вы можете проверить страницу Curl вручную, чтобы увидеть все доступные опции cURL и его функциональные возможности

Man curl

PS. Если вам понравился этот пост, пожалуйста поделитесь им с друзьями в социальных сетях с помощью кнопок ниже или просто оставьте комментарий. Благодарю.

16.02.2006 Джеф Феллинг

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

Curl поможет управлять данными, размещенными в Web

В данной статье рассматривается бесплатный инструмент Curl, с помощью которого можно передавать и принимать Web-страницы из командной строки. Благодаря Curl легко автоматизировать многие операции информационной защиты и администрирования, например извлечь Web-страницу для анализа или загрузить исправление для системы безопасности из Web.

Установка Curl

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

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

Прежде чем использовать Curl с функциями SSL, необходимо загрузить из сети и отдельно установить пакет OpenSSL. Двоичные файлы OpenSSL for Windows можно загрузить с сайта проекта GnuWin32 SourceForge по адресу . На этом сайте имеется и много других полезных инструментов, портированных в 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 обеспечивает методы аутентификации 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-сервер. Поэтому Curl можно настроить на использование proxy-сервера для аутентификации в режимах 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 .

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

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

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

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

./formfind.pl

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

Следует обратить внимание на данные формы 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.

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



Предлагаю немного поговорить о языке программирования PHP, а конкретно затронуть тему расширения CURL , т.е. возможность взаимодействовать с различными серверами по различным протоколам из самого скрипта PHP.

Перед тем как приступить к рассмотрению curl хочу напомнить, что язык PHP мы с Вами уже затрагивали, например, в материале про выгрузку в Excel на PHP или возможность аутентификации на PHP , а теперь давайте поговорим о возможности посылать запросы на PHP.

Что такое CURL?

CURL – это библиотека функций PHP, с помощью которой можно посылать запросы, например, HTTP, из PHP скрипта. CURL поддерживает такие протоколы как HTTP, HTTPS, FTP и другие. Посылать HTTP запросы можно методами GET, POST, PUT.

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

Подключение библиотеки CURL в PHP

Для того чтобы использовать библиотеку CURL ее соответственно нужно подключить.

Примечание! В качестве примера мы будем использовать PHP 5.4.39 на Windows 7, а в качестве Web-сервера у нас будет выступать Apache 2.2.22.

Первое что нужно сделать, это скопировать библиотеки ssleay32.dll, libeay32.dll, libssh2.dll они расположены в директории с PHP, в системный каталог Windows, а именно в C:\Windows\System32 .

Затем в php.ini подключить библиотеку php_curl.dll, т.е. раскомментировать следующую строку

Библиотека не подключена

;extension=php_curl.dll

Библиотека подключена

Extension=php_curl.dll

Все, перезапускаем Apache, вызываем функцию phpinfo() и в случае успешного подключения у Вас должен появиться раздел curl


Если его нет, то это означает только одно, что библиотека не загрузилась, самая распространенная причина этого небыли скопированы вышеперечисленные DLL в системный каталог Windows.

Пример CURL – запрашиваем удаленную страницу для вывода на экран

В данном примере мы просто запросим удаленную страницу по протоколу HTTP методом GET и выведем ее содержимое на экран.

У нас имеется каталог test в нем 2 PHP файла это test_curl.php и test.php, где test_curl.php и есть скрипт где мы будем использовать curl, а test.php удаленный скрипт который мы будем вызывать. Код я подробно прокомментировал.

Код test_curl.php

Код test.php

Заголовок 1"; break; case 2: echo "<Н2>Заголовок 2"; break; case 3: echo "<Н3>Заголовок 3"; break; } } ?>

В итоге если вы запустите test_curl.php у Вас выведется на экран надпись «Заголовок 1», можете поэкспериментировать с передачей параметров id (в данном случае 2 или 3 ).

Пример CURL – вызываем удаленный скрипт и получаем результат

Сейчас давайте попробуем вызвать скрипт и получить результат, для того чтобы потом его обработать, для примера давайте использовать метод POST. Названия файлов оставим такими же.

Код test_curl.php

Код test.php

И если мы запустим test_curl.php то на экран у нас выведется 111, т.е. 1.11 полученное в результате обращения к удаленному скрипту, умноженное на 100.

А теперь давайте поговорим о функциях и константах к ним.

Часто используемые функции CURL и константы

  • curl_init - Инициализирует сеанс;
  • curl_close - Завершает сеанс;
  • curl_exec - Выполняет запрос;
  • curl_errno - Возвращает код ошибки;
  • curl_setopt - Устанавливает параметр для сеанса, например:
    • CURLOPT_HEADER – значение 1 означает, что необходимо вернуть заголовки;
    • CURLOPT_INFILESIZE — параметр для указания ожидаемого размера файла;
    • CURLOPT_VERBOSE — значение 1 означает что CURL будет выводить подробные сообщения о всех производимых операциях;
    • CURLOPT_NOPROGRESS – отключение индикатора прогресса операции, значение 1;
    • CURLOPT_NOBODY – если Вам не нужен документ, а нужны только заголовки, то поставьте значение 1;
    • CURLOPT_UPLOAD — для закачки файла на сервер;
    • CURLOPT_POST – выполнить запрос методом POST;
    • CURLOPT_FTPLISTONLY — получение списка файлов в директории FTP сервера, значение 1;
    • CURLOPT_PUT — выполнить запрос методом PUT, значение 1;
    • CURLOPT_RETURNTRANSFER — возвратить результат, не выводя в браузер, значение 1;
    • CURLOPT_TIMEOUT – максимальное время выполнения в секундах;
    • CURLOPT_URL – указание адреса для обращения;
    • CURLOPT_USERPWD — строка с именем пользователя и паролем в виде :;
    • CURLOPT_POSTFIELDS – данные для POST запроса;
    • CURLOPT_REFERER — задает значение HTTP заголовка «Referer: »;
    • CURLOPT_USERAGENT — задает значение HTTP заголовка «User-Agent: »;
    • CURLOPT_COOKIE — содержимое заголовка «Cookie: », который будет отправлен с HTTP запросом;
    • CURLOPT_SSLCERT- имя файла с сертификатом в формате PEM;
    • CURLOPT_SSL_VERIFYPEER – значение 0, для того чтобы запретить проверку сертификата удаленного сервера (по умолчанию 1);
    • CURLOPT_SSLCERTPASSWD — пароль к файлу сертификата.
  • curl_getinfo - Возвращает информацию об операции, вторым параметром может выступать константа для указания, что именно нужно показать, например:
    • CURLINFO_EFFECTIVE_URL — последний использованный URL;
    • CURLINFO_HTTP_CODE — последний полученный код HTTP;
    • CURLINFO_FILETIME — дата модификации загруженного документа;
    • CURLINFO_TOTAL_TIME — время выполнения операции в секундах;
    • CURLINFO_NAMELOOKUP_TIME — время разрешения имени сервера в секундах;
    • CURLINFO_CONNECT_TIME — время, затраченное на установку соединения, в секундах;
    • CURLINFO_PRETRANSFER_TIME — время, прошедшее от начала операции до готовности к фактической передаче данных, в секундах;
    • CURLINFO_STARTTRANSFER_TIME — время, прошедшее от начала операции до момента передачи первого байта данных, в секундах;
    • CURLINFO_REDIRECT_TIME — время, затраченное на перенаправление, в секундах;
    • CURLINFO_SIZE_UPLOAD — количество байт при закачке;
    • CURLINFO_SIZE_DOWNLOAD — количество байт при загрузке;
    • CURLINFO_SPEED_DOWNLOAD — средняя скорость закачки;
    • CURLINFO_SPEED_UPLOAD — средняя скорость загрузки;
    • CURLINFO_HEADER_SIZE — суммарный размер всех полученных заголовков;
    • CURLINFO_REQUEST_SIZE — суммарный размер всех отправленных запросов;
    • CURLINFO_SSL_VERIFYRESULT — результат проверки SSL сертификата, запрошенной с помощью установки параметра CURLOPT_SSL_VERIFYPEER;
    • CURLINFO_CONTENT_LENGTH_DOWNLOAD — размер загруженного документа, прочитанный из заголовка Content-Length;
    • CURLINFO_CONTENT_LENGTH_UPLOAD — размер закачиваемых данных;
    • CURLINFO_CONTENT_TYPE — содержимое полученного заголовка Content-type, или NULL в случае, когда этот заголовок не был получен.

Подробнее о функциях CURL и константах к ним можете посмотреть на официальном сайте PHP —

Жизнь веб-разработчика омрачена сложностями. Особенно неприятно, когда источник этих сложностей неизвестен. То ли это проблема с отправкой запроса, то ли с ответом, то ли со сторонней библиотекой, то ли внешний API глючит? Существует куча различных прилад, способных упростить нам жизнь. Вот некоторые инструменты командной строки, которые лично я считаю бесценными.

cURL
cURL - программа для передачи данных по различным протоколам, похожая на wget. Основное отличие в том, что по умолчанию wget сохраняет в файл, а cURL выводит в командную строку. Так можно очень просто посмотреть контент веб-сайта. Например, вот как быстро получить свой текущий внешний IP:

$ curl ifconfig.me 93.96.141.93
Параметры -i (показывать заголовки) и -I (показывать только заголовки) делают cURL отличным инструментом для дебаггинга HTTP-ответов и анализа того, что конкретно сервер вам отправляет:

$ curl -I habrahabr.ru HTTP/1.1 200 OK Server: nginx Date: Thu, 18 Aug 2011 14:15:36 GMT Content-Type: text/html; charset=utf-8 Connection: keep-alive Keep-alive: timeout=25
Параметр -L тоже полезный, он заставляет cURL автоматически следовать по редиректам. cURL поддерживает HTTP-аутентификацию, cookies, туннелирование через HTTP-прокси, ручные настройки в заголовках и многое, многое другое.

Siege
Siege - инструмент для нагрузочного тестирования. Плюс, у него есть удобная опция -g , которая очень похожа на curl –iL , но вдобавок показывает вам ещё и заголовки http-запроса. Вот пример с google.com (некоторые заголовки удалены для краткости):

$ siege -g www.google.com GET / HTTP/1.1 Host: www.google.com User-Agent: JoeDog/1.00 (X11; I; Siege 2.70) Connection: close HTTP/1.1 302 Found Location: http://www.google.co.uk/ Content-Type: text/html; charset=UTF-8 Server: gws Content-Length: 221 Connection: close GET / HTTP/1.1 Host: www.google.co.uk User-Agent: JoeDog/1.00 (X11; I; Siege 2.70) Connection: close HTTP/1.1 200 OK Content-Type: text/html; charset=ISO-8859-1 X-XSS-Protection: 1; mode=block Connection: close
Но для чего Siege действительно великолепно подходит, так это для нагрузочного тестирования. Как и апачевский бенчмарк ab , он может отправить множество параллельных запросов к сайту и посмотреть, как он справляется с трафиком. В следующем примере показано, как мы тестируем Google с помощью 20 запросов в течение 30 секунд, после чего выводится результат:

$ siege -c20 www.google.co.uk -b -t30s ... Lifting the server siege... done. Transactions: 1400 hits Availability: 100.00 % Elapsed time: 29.22 secs Data transferred: 13.32 MB Response time: 0.41 secs Transaction rate: 47.91 trans/sec Throughput: 0.46 MB/sec Concurrency: 19.53 Successful transactions: 1400 Failed transactions: 0 Longest transaction: 4.08 Shortest transaction: 0.08
Одна из самых полезных функций Siege - то, что он может работать не только с одним адресом, но и со списком URL’ов из файла. Это отлично подходит для нагрузочного тестирования, потому что можно моделировать реальный трафик на сайте, а не просто жать один и тот же URL снова и снова. Например, вот как использовать Siege, чтобы нагрузить сервер, используя адреса из вашего лога Apache:

$ cut -d " " -f7 /var/log/apache2/access.log > urls.txt $ siege -c -b -f urls.txt
Ngrep
Для серьёзного анализа трафика существует Wireshark с тысячами настроек, фильтров и конфигураций. Есть также версия для командной строки tshark . Но для простых задач функционал Wireshark я считаю избыточным. Так что до тех пор, пока мне не нужно мощное оружие, я использую . Он позволяет делать с сетевыми пакетами то же самое, что grep делает с файлами.

Для веб-трафика вы почти всегда захотите использовать параметр -W , чтобы сохранить форматирование строк, а также параметр -q , который скрывает избыточную информацию о неподходящих пакетах. Вот пример команды, которая перехватывает все пакеты с командой GET или POST:

Ngrep -q -W byline "^(GET|POST) .*"
Вы можете добавить дополнительный фильтр для пакетов, например, по заданному хосту, IP-адресу или порту. Вот фильтр для всего входящего и исходящего трафика на google.com, порт 80, который содержит слово “search”.

Ngrep -q -W byline "search" host www.google.com and port 80

Для чего нужна cURL

  • cURL отлично подходит для имитации действий пользователя в браузере.

Реальный практический пример: вам нужно перезагрузить роутер (модем) для смены IP адреса. Для этого нужно: авторизоваться в роутере, перейти к странице обслуживания и нажать кнопку «Перезагрузка». Если это действие нужно выполнить несколько раз, то процедуру нужно повторить. Согласитесь, делать каждый раз в ручную эту рутину не хочется. cURL позволяет автоматизировать всё это. Буквально несколькими командами cURL можно добиться авторизации и выполнения задания на роутере.

  • cURL удобен для получения данных с веб-сайтов в командной строке.

Ещё один практический пример: мы хотим реализовать показ общей статистики для нескольких сайтов. Если использовать cURL, то это становится вполне тривиальной задачей: с помощью cURL мы проходим аутентификацию на сервисе сбора статистики (если это требуется), затем (опять же командами cURL) получаем необходимые страницы, парсим нужные нам данные; процедура повторяется для всех наших сайтов, затем мы складываем и выводим конечный результат.

Т.е. случаи использования cURL вполне реальные, хотя, в большинстве, cURL нужна программистам, которые используют её для своих программ.

cURL поддерживает множество протоколов и способов авторизации, умеет передавать файлы, правильно работает с кукиз, поддерживает SSL сертификаты, прокси и очень многое другое.

cURL в PHP и командной строке

Мы можем использовать cURL двумя основными способами: в скриптах PHP и в командной строке.

Чтобы включить cURL в PHP на сервере, необходимо в файле php.ini раскоментировать строку

Extension=php_curl.dll

А затем перезагрузить сервер.

На Linux необходимо установить пакет curl.

На Debian, Ubuntu или Linux Mint:

$ sudo apt-get install curl

На Fedora, CentOS или RHEL:

$ sudo yum install curl

Чтобы наглядно было видно разницу в использовании в PHP и в командной строке, будем одни и те же задачи выполнять дважды: сначала в скрипте PHP, а затем в командной строке. Постараемся при этом не запутаться.

Получение данных при помощи cURL

Получение данных при помощи cURL в PHP

Пример на PHP:

Всё очень просто:

$target_url — адрес сайта, который нас интересует. После адреса сайта можно поставить двоеточие и добавить адрес порта (если порт отличается от стандартного).

curl_init — инициализирует новый сеанс и возвращает дискриптор, который в нашем примере присваивается переменной $ch .

Затем мы выполняем запрос cURL функцией curl_exec , которой в качестве параметра передаётся дискриптор.

Всё очень логично, но при выполнении этого скрипта, на нашей странице отобразиться содержимое сайта. А что если мы не хотим отображать содержимое, а хотим записать его в переменную (для последующей обработки или парсинга).

Чуть дополним наш скрипт:

0) { echo "Ошибка curl: " . curl_error($ch); } curl_close($ch); ?>

У нас появилась строчка curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); .

curl_setopt — задаёт опции. Полный список опций можно найти на этой странице: http://php.net/manual/ru/function.curl-setopt.php

$response_data = curl_exec($ch);

Теперь значение скрипта присваивается переменной $response_data, с которой можно проводить дальнейшие операции. Например, можно вывести её содержимое.

If (curl_errno($ch) > 0) { echo "Ошибка curl: " . curl_error($ch); }

служат для отладки, на случай возникновения ошибок.

Получение данных при помощи cURL в командной строке

В командной строке достаточно набрать

Curl mi-al.ru

где вместо mi-al.ru — адрес вашего сайта.

Если нужно скопировать данные в переменную, а не выводить полученный результат на экран, то делаем так:

Temp=`curl mi-al.ru`

При этом всё равно выводятся некие данные:

Чтобы они не выводились, добавляем ключ -s :

Temp=`curl -s mi-al.ru`

Можно посмотреть, что записалось:

Echo $temp | less

Базовая аутентификация и аутентификация HTTP

Аутентификация, проще говоря, это введение имени пользователя и пароля.

Базовая аутентификация — это аутентификация средствами сервера. Для этого создаются два файла: .htaccess и .htpasswd

Содержимое файла.htaccess примерно такое

AuthName "Только для зарегистрированных пользователей!" AuthType Basic require valid-user AuthUserFile /home/freeforum.biz/htdocs/.htpassw

Содержимое файла.htpasswd примерно такое:

Mial:CRdiI.ZrZQRRc

Т.е. логин и хэш пароля.

При попытке получить доступ к запароленной папке, в браузере отобразиться примерно такое окно:

HTTP аутентификация — это тот случай, когда мы вводим логин и пароль в форму на сайте. Именно такая аутентификация используется при входе в почту, на форумы и т. д.

Базовая аутентификация cURL (PHP)

Есть сайт http://62.113.208.29/Update_FED_DAYS/, который требует от нас авторизоваться:

Пробуем наш первоначальный скрипт:

0) { echo "Ошибка curl: " . curl_error($ch); } else { echo $response_data; } curl_close($ch); ?>

Хотя скрипт и считает, что ошибки нет, но выводимый результат нам совсем не нравится:

Добавляем две строки:

Curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, "ru-board:ru-board");

Первой строкой мы задаём тип аутентификации — базовая. Вторая строка содержит имя и пароль через двоеточие (в нашем случае имя и пароль одинаковые — ru-board). Получилось так:

0) { echo "Ошибка curl: " . curl_error($ch); } else { echo $response_data; } curl_close($ch); ?>

Базовая аутентификация cURL (в командной строке)

Этого же самого в командной строке можно добиться одной строчкой:

Curl -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/

Я не забыл указать тип аутентификации, просто в cURL базовый тип аутентификации является дефолтным.

В командной строке всё получилось так быстро, что от расстройства я написал вот такую программу. Она подключается к сайту и скачивает самое последнее обновление:

Temp=`curl -s -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/ | grep -E -o "Update_FED_201{1}.{2}.{2}.7z" | uniq | tail -n 1`; curl -o $temp -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/$temp

Буквально ещё несколькими командами можно добавить:

  • распаковку архива в указанный каталог;
  • запуск обновлений КонсультантПлюс (это обновления для него);
  • можно реализовать проверку — было ли уже скачено последнее доступное обновление или появилось новое;
  • добавить это всё в Cron для ежедневных обновлений.

HTTP аутентификация cURL

HTTP аутентификация cURL в PHP

Нам нужно знать:

  • адрес, куда отправлять данные для аутентификации
  • метод отправки GET или POST
  • логин
  • пароль

Иногда этих данных оказывается недостаточно. Давайте разберёмся.

Адрес, куда нужно отправить данные, можно взять из формы аутентификации. Например:

Мы смотрим на свойство action . Т.е. конечной страницей является login.php . Нам нужен полный адрес, например такой http://188.35.8.64:8080/login.php

Здесь же мы находим и метод отправки: method="post"

Логин и пароль я тоже знаю: admin и qwerasdfzxcv

На всякий случай — это не мой роутер (и я не знаю чей), поэтому если вы хотите досадить именно мне, то не нужно пакостить на этом роутере.

Т.е. на сервер из формы передаётся строка методом POST. Теоретически, наш предыдущий скрипт, в которое мы добавили новую строчку, должен работать. Т.е. должна происходить аутентификация.

0) { echo "Ошибка curl: " . curl_error($ch); } else { } curl_close($ch); ?>

В скрипте новая строка

curl_setopt($ch, CURLOPT_POSTFIELDS, "LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv");

Здесь curl_setopt — уже знакомая нам функция по установлению опций для cURL, CURLOPT_POSTFIELDS — эта имя опции, которую мы устанавливаем. CURLOPT_POSTFIELDS содержит все данные, которые передаются методом POST. Ну и сама строчка LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv — это те самые данные, которые мы передаём.

Если внимательно изучить форму, то можно увидеть, что она содержит также и скрытые поля. А ещё данные могут обрабатываться или дополняться JavaScript"ами. Можно заняться изучением всего этого, но я предпочитаю более простой способ.

Я использую Wireshark. Эта программа предназначена для снифинга (перехвата) трафика. И именно в ней очень удобно смотреть, что же именно передаётся на сайт.

Посмотрите это крошечное видео:

Т.е. с адресом, куда передаются данные, я угадал. А вот передаваемая строка оказалась намного сложнее.

Я вписал верный параметр, а также чуть доработал скрипт, чтобы он не просто авторизовался, но и кое-что получал из роутера:

0) { echo "Ошибка curl: " . curl_error($ch); } else { $target_url2 = "http://188.35.8.64:8080/bsc_wlan.php"; $ch2 = curl_init($target_url2); curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1); $response_data2 = curl_exec($ch2); preg_match("|f.ssid.value = "(.*)";|", $response_data2, $results2); $results2 = str_replace("f.ssid.value = "", "", $results2); $results2 = str_replace("";", "", $results2); echo "Имя wi-fi сети: $results2
"; preg_match("|f_wpa.wpapsk1.value(.*)";|", $response_data2, $results3); $results3 = str_replace("f_wpa.wpapsk1.value", "", $results3); $results3 = str_replace("="", "", $results3); $results3 = str_replace("";", "", $results3); echo "Пароль wi-fi сети: $results3"; } curl_close($ch); ?>

Кстати, если владелец обновит пароль (но не обновит прошивку), то новый пароль всегда можно посмотреть по адресу http://188.35.8.64:8080/model/__show_info.php?REQUIRE_FILE=/var/etc/httpasswd

(Это общеизвестная уязвимость роутеров D-Link DIR-300, D-Link DIR-320, и D-Link DAP-1353).

HTTP аутентификация cURL в командной строке

Полный адрес, а также строку, которую нужно передать, мы уже знаем. Поэтому всё просто:

Curl --data "ACTION_POST=LOGIN&FILECODE=&VERIFICATION_CODE=&LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv&login=Log+In+&VER_CODE=" http://188.35.8.64:8080/login.php

Думаю, всё и так понятно, т. к. эти сроки мы уже рассмотрели. Если кому-то непонятно — спрашивайте в комментариях.

Примером использования cURL для получения и парсинга данных может стать следующий набор команд:

Curl -s --data "ACTION_POST=LOGIN&FILECODE=&VERIFICATION_CODE=&LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv&login=Log+In+&VER_CODE=" http://188.35.8.64:8080/login.php > /dev/null && echo -e "nn" && echo "Имя сети Wi-Fi" && curl -s http://188.35.8.64:8080/bsc_wlan.php | grep -E "f.ssid.value = "(.)*";" | sed "s/f.ssid.value = "//" | sed "s/";//" && echo "Пароль сети Wi-Fi" && curl -s http://188.35.8.64:8080/bsc_wlan.php | grep -E "f_wpa.wpapsk1.(.)*";" | sed "s/f_wpa.wpapsk1.value//" | sed "s/";//" | sed "s/="//"

Сложные случаи авторизации: AJAX, JQuery, JavaScript и т.п.

Данные заголовок правильнее было бы написать так: «Сложные» случаи авторизации. Т.е. слово «сложные» взять в кавычки. Сложными они видятся только на первый взгляд, когда непонятно: куда происходит отправка, какие имена полей, что именно отправляется и т. д.

Но, на самом деле, все они сводятся к методам POST или GET. Чтобы понять, что именно отправляется, можно сохранить страницу с формой себе на диск и на кнопку отправки повесить функцию показа сформированных для отправки данных. Или ещё проще — как я, Wireshark"ом.

Если данные правильные, а аутентификация не происходит, то нужно копать в следующих направлениях:

  • задать верную строку реферера
  • задать «правильную» строку пользовательского агента.

Всё это можно сделать базовыми методами cURL, но я не буду на этом останавливаться. Урок получился и без того большим, а ведь я ещё хотел показать пару трюков с cURL.

Типсы и триксы cURL

cURL и получение кукиз помимо CURLOPT_COOKIEJAR

Думаю, уже стало понятно, что cURL правильно обрабатывает куки — сохраняет их, использует, когда сервер запрашивает, и т. д. Но иногда куки нужно сохранить. Для этого есть опция CURLOPT_COOKIEJAR, но воспользоваться ей можно не всегда. Этому и посвящён наш первый трюк.

Иногда из-за особенностей настройки PHP на сервере, нам недоступны такие опции как CURLOPT_COOKIEJAR (позволяет сохранить полученные куки в файл) и CURLOPT_COOKIEFILE (позволяет использовать куки из файла). Т.к. они говорят, что используя эти опции мы сможем стянуть любой файл с их сервера. Вот решение этой проблемы:

1) Не используем CURLOPT_FOLLOWLOCATION

2) Используем curl_setopt($ch, CURLOPT_HEADER, 1)

3) Собираем кукизы из заголовка header примерно так:

Preg_match_all("|Set-Cookie: (.*);|U", $content, $results); $cookies = implode(";", $results);

4) Задаём их используя curl_setopt($ch, CURLOPT_COOKIE, $cookies);

Второй совет. Из атакующих мы можем превратиться в жертву. Чтобы не стать жертвой атаки человек-по-середине, делаем так.

Пожалуйста, все, перестаньте устанавливать настройку CURLOPT_SSL_VERIFYPEER на false или 0. Если ваша установка PHP не имеет актуального комплекта корневых сертификатов CA, загрузите один на веб-сайте curl и сохраните его на ваш сервер:

Затем задайте путь в вашем файле php.ini file, например, на Windows:

Curl.cainfo=c:phpcacert.pem

Отключение CURLOPT_SSL_VERIFYPEER позволяет осуществить атаку человек-по-середине (MITM), а это нам не надо!

Ну и последняя на сегодня подсказка. Знаете ли вы, что возможно большое количество асинхронных запросов curl?

Для этого можно использовать curl_multi_init . Подробности и пример кода в официальной документации http://php.net/manual/ru/function.curl-multi-init.php

Про cURL в командной строке

Man curl

Для чтения на русском языке также подготовлена вторая часть урока cURL: " ".