Нам часто приходится загружать различные файлы из интернета, например, исполняемые файлы программ, файлы скриптов, архивы с исходниками. Но не всегда это нужно делать через браузер. Во многих ситуациях гораздо проще выполнить все действия через терминал. Поскольку таким образом вы можете автоматизировать процесс. С другой стороны, веб-мастерам время от времени приходится тестировать доступность веб-сайтов, проверять отправляемые и получаемые заголовки и многое другое.
Для решения таких задач и задач подобного круга можно воспользоваться утилитой curl. Она позволяет решить намного более широкий круг задач, среди которых даже имитация действий пользователя на сайте. В этой статье мы рассмотрим как пользоваться curl, что это такое и зачем нужна эта программа.
На самом деле, curl - это больше чем просто утилита командной строки для Linux или Windows. Это набор библиотек, в которых реализуются базовые возможности работы с URL страницами и передачи файлов. Библиотека поддерживает работу с протоколами: FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, а также POP3, IMAP и SMTP. Она отлично подходит для имитации действий пользователя на страницах и других операций с URL адресами.
Поддержка библиотеки curl была добавлена в множество различных языков программирования и платформ. Утилита curl - это независимая обвертка для этой библиотеки. Именно на этой утилите мы и остановимся в этой статье.
Команда curl
Перед тем как перейти к описанию того как может использоваться команда curl linux, давайте разберем саму утилиту и ее основные опции, которые нам понадобятся. Синтаксис утилиты очень прост:
$ curl опции ссылка
Теперь рассмотрим основные опции:
- -# - отображать простой прогресс-бар во время загрузки;
- -0 - использовать протокол http 1.0;
- -1 - использовать протокол шифрования tlsv1;
- -2 - использовать sslv2;
- -3 - использовать sslv3;
- -4 - использовать ipv4;
- -6 - использовать ipv6;
- -A - указать свой USER_AGENT;
- -b - сохранить Cookie в файл;
- -c - отправить Cookie на сервер из файла;
- -C - продолжить загрузку файла с места разрыва или указанного смещения;
- -m - максимальное время ожидания ответа от сервера;
- -d - отправить данные методом POST;
- -D - сохранить заголовки, возвращенные сервером в файл;
- -e - задать поле Referer-uri, указывает с какого сайта пришел пользователь;
- -E - использовать внешний сертификат SSL;
- -f - не выводить сообщения об ошибках;
- -F - отправить данные в виде формы;
- -G - если эта опция включена, то все данные, указанные в опции -d будут передаваться методом GET;
- -H - передать заголовки на сервер;
- -I - получать только HTTP заголовок, а все содержимое страницы игнорировать;
- -j - прочитать и отправить cookie из файла;
- -J - удалить заголовок из запроса;
- -L - принимать и обрабатывать перенаправления;
- -s - максимальное количество перенаправлений с помощью Location;
- -o - выводить контент страницы в файл;
- -O - сохранять контент в файл с именем страницы или файла на сервере;
- -p - использовать прокси;
- --proto - указать протокол, который нужно использовать;
- -R - сохранять время последнего изменения удаленного файла;
- -s - выводить минимум информации об ошибках;
- -S - выводить сообщения об ошибках;
- -T - загрузить файл на сервер;
- -v - максимально подробный вывод;
- -y - минимальная скорость загрузки;
- -Y - максимальная скорость загрузки;
- -z - скачать файл, только если он был модифицирован позже указанного времени;
- -V - вывести версию.
Это далеко не все параметры curl linux, но здесь перечислено все основное, что вам придется использовать.
Как пользоваться curl?
Мы рассмотрели все, что касается теории работы с утилитой curl, теперь пришло время перейти к практике, и рассмотреть примеры команды curl.
Самая частая задача - это . Скачать файл очень просто. Для этого достаточно передать утилите в параметрах имя файла или html страницы:
curl https://raw.githubusercontent.com/curl/curl/master/README.md
Но тут вас ждет одна неожиданность, все содержимое файла будет отправлено на стандартный вывод. Чтобы записать его в какой-либо файл используйте:
curl -o readme.txt https://raw.githubusercontent.com/curl/curl/master/README.md
А если вы хотите, чтобы полученный файл назывался так же, как и файл на сервере, используйте опцию -O:
curl -O https://raw.githubusercontent.com/curl/curl/master/README.md
curl -# -C - -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz
Если нужно, одной командой можно скачать несколько файлов:
curl -O https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README
Еще одна вещь, которая может быть полезной администратору - это загрузка файла, только если он был изменен:
curl -z 21-Dec-17 https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README
Ограничение скорости
Вы можете ограничить скорость загрузки до необходимого предела, чтобы не перегружать сеть с помощью опции -Y:
curl --limit-rate 50K -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz
Здесь нужно указать количество килобайт в секунду, которые можно загружать. Также вы можете разорвать соединение если скорости недостаточно, для этого используйте опцию -Y:
curl -Y 100 -O https://raw.githubusercontent.com/curl/curl/master/README.md
Передача файлов
curl -T login.txt ftp://speedtest.tele2.net/upload/
Или проверим отправку файла по HTTP, для этого существует специальный сервис:
curl -T ~/login.txt http://posttestserver.com/post.php
В ответе утилита сообщит где вы можете найти загруженный файл.
Отправка данных POST
Вы можете отправлять не только файлы, но и любые данные методом POST. Напомню, что этот метод используется для отправки данных различных форм. Для отправки такого запроса используйте опцию -d. Для тестирования будем пользоваться тем же сервисом:
curl -d "field1=val&fileld2=val1"http://posttestserver.com/post.php
Если вас не устраивает такой вариант отправки, вы можете сделать вид, что отправили форму. Для этого есть опция -F:
curl -F "password=@pass;type=text/plain" http://posttestserver.com/post.php
Здесь мы передаем формой поле password, с типом обычный текст, точно так же вы можете передать несколько параметров.
Передача и прием куки
Куки или Cookie используются сайтами для хранения некой информации на стороне пользователя. Это может быть необходимо, например, для аутентификации. Вы можете принимать и передавать Cookie с помощью curl. Чтобы сохранить полученные Cookie в файл используйте опцию -c:
curl -c cookie.txt http://posttestserver.com/post.php
Затем можно отправить cookie curl обратно:
curl -b cookie.txt http://posttestserver.com/post.php
Передача и анализ заголовков
Не всегда нам обязательно нужно содержимое страницы. Иногда могут быть интересны только заголовки. Чтобы вывести только их есть опция -I:
curl -I https://сайт
А опция -H позволяет или несколько на сервер, например, можно передать заголовок If-Modified-Since чтобы страница возвращалась только если она была изменена:
Аутентификация curl
Если на сервере требуется аутентификация одного из распространенных типов, например, HTTP Basic или FTP, то curl очень просто может справиться с такой задачей. Для указания данных аутентификации просто укажите их через двоеточие в опции -u:
curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt
Точно так же будет выполняться аутентификация на серверах HTTP.
Использование прокси
Если вам нужно использовать прокси сервер для загрузки файлов, то это тоже очень просто. Достаточно задать адрес прокси сервера в опции -x:
curl -x proxysever.test.com:3128 http://google.co.in
Выводы
В этой статье мы рассмотрели как пользоваться curl, зачем нужна эта утилита и основные ее возможности. Несмотря на свою схожесть с , они очень сильно отличаются. Команда curl linux предназначена больше для анализа и имитации различных действий на сервере, тогда как wget больше подходит для загрузки файлов и краулинга сайтов.
Предлагаю немного поговорить о языке программирования 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Н1>"; break; case 2: echo "<Н2>Заголовок 2Н2>"; break; case 3: echo "<Н3>Заголовок 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 —
Реальный практический пример: вам нужно перезагрузить роутер (модем) для смены IP адреса. Для этого нужно: авторизоваться в роутере, перейти к странице обслуживания и нажать кнопку «Перезагрузка». Если это действие нужно выполнить несколько раз, то процедуру нужно повторить. Согласитесь, делать каждый раз в ручную эту рутину не хочется. 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 - задаёт опции. Полный список опций можно найти на этой странице:
Скрыто от гостей
$response_data = curl_exec($ch);
Теперь значение скрипта присваивается переменной $response_data, с которой можно проводить дальнейшие операции. Например, можно вывести её содержимое.
Строчки
If (curl_errno($ch) > 0) { echo "Ошибка curl: " . curl_error($ch); }
служат для отладки, на случай возникновения ошибок.
Получение данных при помощи cURL в командной строке
В командной строке достаточно набрать
где вместо 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)
Есть сайт
Скрыто от гостей
Пробуем наш первоначальный скрипт:
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); ?> Пробуем: 30946 Отлично! Базовая аутентификация 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 в PHP
Нам нужно знать:
- адрес, куда отправлять данные для аутентификации
- метод отправки GET или POST
- логин
- пароль
Адрес, куда нужно отправить данные, можно взять из формы аутентификации. Например:
Коммуникации и связь в израиле Какую связь выбрать туристам
Одноклассники – социальная сеть: регистрация нового пользователя через логин и пароль: правила регистрации
Как бесплатно зарегистрироваться в социальной сеть одноклассники
Обновление ПО MegaFon Login SP-AI
Как увеличить свой доход на ютуб