Зачем включать подробный режим
Когда curl просто завершается ошибкой или возвращает не то, что ожидалось, сообщение из одной строки мало что объясняет. Ключ -v (от verbose) заставляет утилиту рассказывать обо всём по порядку: к какому адресу она подключается, как проходит защищённое соединение, какие заголовки отправлены и что ответил сервер.
Читать такой вывод нужно как хронологию. Запрос проходит несколько этапов: узнать адрес по имени, открыть соединение, договориться о защите, отправить запрос, получить ответ. Сбой на каждом этапе выглядит по-своему, и по последней напечатанной строке видно, на каком этапе остановились.
Служебный вывод направляется в поток ошибок, а тело ответа — в стандартный вывод. Поэтому для сохранения подробностей в файл используйте 2> файл, а чтобы не засорять экран телом страницы, добавьте -o /dev/null. Привычная пара для диагностики выглядит так: curl -v -o /dev/null и адрес сайта вместе со схемой https.
Значки в начале строк
Первое, что нужно усвоить: у каждой строки есть префикс, который показывает её происхождение.
| Префикс | Что это |
|---|---|
| * | Сообщение самой утилиты: адрес, этапы соединения, сведения о сертификате |
| > | Заголовки, которые curl отправил серверу |
| < | Заголовки, которые вернул сервер |
| { и } | Передача данных, например при согласовании защиты; обычно её можно пропустить |
По тексту сообщений видно, что происходило. Строка вроде «Trying» с адресом и портом значит, что curl начал подключение. Строка «Connected to» сообщает об установленном соединении. Если дальше «Trying» ничего нет, а команда ждёт и завершается по таймауту, пакеты не доходят: проблема в сети, файерволе или недоступном сервере.
Конкретные формулировки отличаются в разных версиях curl, поэтому ориентируйтесь на смысл и порядок, а не на точный текст.
Этап за этапом: что искать в выводе
Пройдём типичную цепочку и отметим, какие строки важны.
- Разрешение имени. Если curl не смог узнать адрес, он сообщит об этом сразу, и до подключения дело не дойдёт. Это ошибка DNS, подробнее — на странице про curl 6.
- Подключение. Строка о попытке подключиться, затем об успехе. Отказ в соединении означает, что на этом адресе и порту никто не слушает, подробнее — на странице про curl 7.
- Защищённое соединение. Здесь появляются сведения о версии протокола шифрования, о сертификате сервера: кому выдан, кем и до какой даты действует. Фраза о том, что проверка прошла, означает успех, а сообщение об ошибке проверки указывает на проблему с сертификатом.
- Запрос. Строки с префиксом «>»: метод, путь, заголовок Host и прочие.
- Ответ. Строки с префиксом «<»: код ответа и заголовки.
Если соединение установлено, а ответ не приходит, смотрите последнюю строку со знаком «>»: сервер получил запрос и думает или завис. Это уже вопрос к самому сайту, а не к вашей сети.
Что видно в заголовках запроса и ответа
Блок со знаком «>» показывает, что именно вы отправили. Там обычно есть строка метода и пути, заголовок Host с именем сайта, User-Agent с названием curl и заголовок Accept. Если вы добавляли свои заголовки ключом -H, они тоже будут здесь, и это хороший способ убедиться, что они ушли в нужном виде.
Блок со знаком «<» показывает ответ. Первая строка содержит версию протокола и код, например 200, 301 или 503. Дальше идут заголовки: тип содержимого, размер, дата, управление кэшем. При перенаправлении увидите заголовок Location с новым адресом. Чтобы curl сам прошёл по цепочке перенаправлений, добавьте -L, а разбор заголовков описан на отдельной странице про -I и -L.
Версия протокола в первой строке ответа показывает, как договорились клиент и сервер: это HTTP/1.1, HTTP/2 или другая версия, зависит от настроек сервера. Само по себе это не признак ошибки.
Для ещё большей детализации есть ключ --trace-ascii с именем файла и ключ --trace-time, добавляющий метки времени. Они нужны, когда требуется увидеть передаваемые данные и точное время каждого этапа.
Типичные признаки проблем и безопасность вывода
Сведём наблюдения в короткую шпаргалку.
- Нет строки о подключении и ошибка про имя — проблема DNS или опечатка в адресе.
- «Trying» есть, «Connected» нет, затем таймаут — пакеты не доходят до сервера.
- Подключились, затем ошибка при защищённом соединении — проблема сертификата, времени на компьютере или поддерживаемых версий защиты.
- Запрос отправлен, ответ с кодом 4xx или 5xx — соединение в порядке, возражает сам сервер или приложение.
- Ответ 301 или 302 с Location — запрошенный адрес перенесён, посмотрите, куда именно.
Обратите внимание на безопасность. В выводе -v отображаются заголовки, а значит и те, что содержат авторизацию: токены, cookie, пароли в заголовках. Прежде чем публиковать вывод в чате, на форуме или отправлять специалисту, замените такие значения на условные. Это касается и режима trace, где видно ещё больше.
Для проверки одного только кода ответа или времени удобнее специализированные ключи, описанные на страницах про код ответа и про -w. Подробный режим стоит включать, когда нужно понять причину, а не просто измерить результат.
Дополнительные ключи, которые дополняют -v
Подробный режим удобнее, если сочетать его с несколькими другими ключами.
- -s убирает индикатор прогресса, а -S оставляет вывод ошибок; пара -sS даёт чистый вывод без лишнего шума;
- -I отправляет запрос HEAD и показывает только заголовки;
- -L следует за перенаправлениями, и в выводе -v видно каждый шаг цепочки;
- --max-time ограничивает общее время запроса, чтобы команда не зависала;
- --connect-timeout ограничивает ожидание подключения;
- --http1.1 заставляет использовать эту версию протокола, если нужно сравнить поведение.
Если вам нужен лишь итог в виде числа, удобнее ключ -w, а если нужно сравнить разные серверы, то --resolve. Все они описаны на соседних страницах и отлично сочетаются с -v. Начинайте с минимального набора ключей и добавляйте по одному, чтобы понимать, какой именно влияет на результат.