Оттачиваем мастерство работы с cURL
Автор: Obaro Ogbo
Дата публикации: 29 апреля 2015 года
Перевод: А. Кривошей
Дата перевода: июль 2015 г.
curl - это кроссплатформенная утилита командной строки для получения и отправки файлов, использующая синтаксис URL. Название является рекурсивным акронимом для Curl URL Request Library, и это очень мощная программа, поддерживающая большое количество сетевых протоколов, включая HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, LDAP, LDAPS, DICT, TELNET, FILE, IMAP, POP3, SMTP и RTSP.
curl поддерживает огромное количество полезных функций, в том числе аутентификацию пользователей, прокси-серверы, FTP, HTTP post, куки, возобновление передачи файлов, SSL-соединения и многое другое. В этой статье мы рассмотрим основные возможности curl для тех, кто впервые сталкивается с этой программой или мало знает о ней.
Установка
Для установки curl в системе Debian/Ubuntu используйте следующую команду:
$ sudo apt-get install curl
Синтаксис
curl ждет аргумент в виде url, и будет пытаться скачать любой файл, доступный по этому адресу.
$ curl http://www.maketecheasier.com
По умолчанию содержимое передаваемого файла отображается в командной строке. Если задан выходной файл, программа будет показывать индикатор прогресса с отображением количества переданных данных, скорость передачи, предполагаемое оставшееся время и потраченное время. Для сохранения скачиваемого файла под заданным именем используется опция -o:
$ curl -o mte-index.html http://www.maketecheasier.com
Для сохранения файла с тем же именем, что и на сервере, используется опция -O:
$ curl -O ftp://ftp.kernel.org/pub/linux/kernel/v4.x/linux-4.0.tar.xz
Получение файла с ftp-сервера, где требуется авторизация:
$ curl -O ftp://username:[email protected]/pub/linux/kernel/v4.x/linux-4.0.tar.xz
Для того, чтобы задать несколько URL или частей URL, поместите эти части в фигурные скобки:
$ curl -O http://www.maketecheasier.com/author/{obaro,ivana,vamsi}
Вы также можете задать последовательный диапазон с помощью квадратных скобок:
$ curl -O ftp://ftp.numericals.com/file.txt $ curl -O ftp://ftp.letters.com/file.txt $ curl -O http://any.org/archive/vol/part{a,b,c}.html
$ curl -o "file_#1.txt" http://{one,two}.site.com $ curl -o "output_#1_#2" http://{site,host}.host.com
Вы можете задать строку User-Agent для идентификации на серверах, для соединений http используйте флаг -A:
$ curl -A "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0"-o mte-index.html http://www.maketecheasier.com
Для отправки данных с использованием HTTP POST предназначена опция -d:
$ curl -d "username=obaro" -d "password=password" http://maketecheasier.com
$ curl -d "username=obaro" -d "password=password" -c mte-cookies http://maketecheasier.com
Для использования этих сохраненных куки предназначена опция -b:
$ curl -b mte-cookies -d "hc_comment=This is a comment&submit=true" http://www.maketecheasier.com/monitor-hard-disk-health-linux/
Чтобы закачать файл на сайт, воспользуйтесь опцией -T. Для серверов http(s) вместо этого используется команда PUT:
$ curl -T "file1.jpg" http://www.uploadmania.com/upload
Чтобы в принудительном порядке задействовать соединение SSL/TLS, используется флаг --ssl-reqd. Также вы можете активировать SSL/TLS одной командой для нескольких файлов:
$ curl --ssl-reqd -T "file.jpg" ftp://username:[email protected]/upload
С помощью опции -u вы можете задать данные для авторизации:
$ curl -u username:password --ssl-reqd -T "file.jpg" ftp://ftp.uploadmania.com/upload
curl - очень простая, надежная и функциональная программа. Она имеет огромное количество опций и поддерживает множество протоколов, мы рассмотрели лишь малую долю ее возможностей. Если вы хотите изучить ее в совершенстве, читайте man-страницу.
Представляем вашему вниманию новый курс от команды The Codeby - "Тестирование Веб-Приложений на проникновение с нуля". Общая теория, подготовка рабочего окружения, пассивный фаззинг и фингерпринт, Активный фаззинг, Уязвимости, Пост-эксплуатация, Инструментальные средства, Social Engeneering и многое другое.
Для чего нужна 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
- логин
- пароль
Иногда этих данных оказывается недостаточно. Давайте разберёмся.
Адрес, куда нужно отправить данные, можно взять из формы аутентификации. Например: