Вопрос или проблема
Я использую curl для вызова веб-сервиса, который использует Transfer-Encoding: chunked
для своих ответов. Я могу использовать опции --raw
и --no-buffer
, чтобы получать сырые фрагменты по мере их поступления:
curl -k -D - "https://somesite.com/justdoit" --http1.1 --no-buffer --raw
И это почти делает то, что я хочу:
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Strict-Transport-Security: max-age=2592000
Date: Wed, 15 Jan 2025 16:04:06 GMT
Set-Cookie: cookiesession1=678B297C93095B7E2ACF070259B276F9;Expires=Thu, 15 Jan 2026 16:04:06 GMT;Path=/;HttpOnly
6
<html>
4d6
<script src="js/select.js"></script>
<script>
...
Однако мне также нужно выводить текущую дату и время для каждого записанного фрагмента. Например:
2025-01-15 14:30:20
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Strict-Transport-Security: max-age=2592000
Date: Wed, 15 Jan 2025 16:04:06 GMT
Set-Cookie: cookiesession1=678B297C93095B7E2ACF070259B276F9;Expires=Thu, 15 Jan 2026 16:04:06 GMT;Path=/;HttpOnly
2025-01-15 14:30:21
6
<html>
2025-01-15 14:30:22
4d6
<script src="js/select.js"></script>
<script>
...
Есть ли для этого опция?
Спасибо
curl не имеет встроенной опции для добавления временной метки к каждому фрагменту вывода, но вы можете достичь этого с помощью обертки-скрипта.
- Используя простой shell-скрипт с
ts
(из пакетаmoreutils
):
curl -k -D - "https://somesite.com/justdoit" --http1.1 --no-buffer --raw | ts '%Y-%m-%d %H:%M:%S'
- Если у вас нет установленного
ts
, вы можете создать более подробный обертка-скрипт:
#!/bin/bash
curl -k -D - "https://somesite.com/justdoit" --http1.1 --no-buffer --raw | while IFS= read -r line; do
echo "$(date '+%Y-%m-%d %H:%M:%S') $line"
done
Оба подхода будут добавлять временную метку к каждой строке по мере ее поступления. Второй скрипт дает вам больше контроля над форматом временной метки, если это необходимо.
Ответ или решение
Работа с утилитами для командной строки, такими как curl
, предоставляет широкий спектр возможностей для взаимодействия с веб-сервисами. curl
— это инструмент для передачи данных, который поддерживает множество протоколов, среди которых HTTP, HTTPS, FTP и другие. Одной из его особенностей является работа с HTTP-запросами, включая поддержку заголовков типа Transfer-Encoding: chunked
. Этот заголовок используется для передачи данных частями в случаях, когда размер всего содержимого заранее неизвестен.
Теоретическая часть
Однако, curl
по умолчанию не предлагает встроенной функциональности для добавления временной метки к каждому полученному блоку данных. Вопрос, озвученный пользователем, заключается в том, как выйти из этого ограничения и обеспечить вывод текущего времени при каждом выводе данных.
Инструменты и возможности
Для решения этой задачи существуют альтернативные подходы, использующие обёртки или внешние утилиты. Одна из таких утилит — ts
, которая входит в пакет moreutils
. Эта утилита позволяет добавлять временную метку ко входящим данным, что делает ее отличным инструментом для нашего сценария.
В качестве альтернативы можно использовать скрипты на языках shell, таких как bash, чтобы вручную добавить временные метки к каждому фрагменту данных при их получении.
Практическая часть
Использование утилиты ts
Если moreutils
у вас установлена, вам потребуется всего лишь одна строка для выполнения этой задачи:
curl -k -D - "https://somesite.com/justdoit" --http1.1 --no-buffer --raw | ts '%Y-%m-%d %H:%M:%S'
Этот подход минимален и эффективен. Утилита ts
автоматически добавляет временные метки ко всем входящим данным, поступающим от curl
.
Создание скрипта на bash
Если у вас не установлена утилита ts
, вы можете создать собственный bash-скрипт для достижения аналогичной функциональности:
#!/bin/bash
curl -k -D - "https://somesite.com/justdoit" --http1.1 --no-buffer --raw | while IFS= read -r line; do
echo "$(date '+%Y-%m-%d %H:%M:%S') $line"
done
Этот скрипт использует стандартный цикл while для обработки каждой строки данных по мере их поступления. Функция date
в комбинации с echo
используется для вывода текущего времени перед каждым фрагментом данных.
Применение и применение решений
Преимущества предложенных подходов
-
Гибкость: Второй подход (с использованием bash-скрипта) позволяет полностью контролировать формат временной метки. Вы можете легко настроить его под свои нужды, изменив формат, добавив дополнительную информацию или применив другие изменения.
-
Простота: Подходы не требуют сложных зависимостей, а основываются на стандартных инструментах UNIX/Linux, тем самым обеспечивая кроссплатформенность и простоту внедрения.
-
Эффективность: Ввод временной метки непосредственно во время передачи данных помогает легко сопоставлять временные интервалы с поступающей информацией, что может быть крайне полезно для отладки, мониторинга или ведения журнала взаимодействий с API.
Заключение
В приведенном сценарии оба предложенных решения обеспечивают добавление временной метки к каждому блоку данных, полученному с помощью curl
. Это не только расширяет функциональность базового инструмента, но и делает работу с данными более удобной и управляемой.
Рекомендация будет заключаться в использовании подхода, который наиболее соответствует вашим конкретным условиям — для пользователей, имеющих возможность установки moreutils
, утилита ts
обеспечивает быстрое и надежное решение. В противном случае, собственные скрипты на bash станут не менее мощным решением этой задачи. Каждый из описанных подходов демонстрирует, как с помощью команд оболочки и скриптов можно значительно расширить возможности стандартных утилит, превращая их в адаптивные инструменты для решения разнообразных задач.