Установите дату и время из HTTP-заголовка в роутере с помощью curl или wget.

Вопрос или проблема

Эта техника должна быть похожей или такой же, как и в Ubuntu; хотя следующий код не работает на маршрутизаторе. Один из методов следующий:

dateFromServer=$(curl -v --silent https://google.com/ 2>&1 \
 | grep Date | sed -e 's/< Date: //')
date +"%d%m%Y%H%M%S" -d "$dateFromServer"

Результат:

‘ate: неверная дата ‘Сб, 12 мая 2018 18:49:18 GMT

или получите дату из заголовка HTTP-ответа. Уберите лишнее. Установите дату.

date -s `curl -I 'https://startpage.com/' 2>/dev/null | grep -i '^date:' | sed 's/^[Dd]ate: //g'`

Результаты, которые я получаю, следующие:

@Heyzeus:/tmp/home/root# date -s `curl -I 'https://google.com/' 2>/dev/null | grep -i '^date:' | sed 's/^[Dd]ate: //g'` BusyBox v1.25.1 (2018-05-06 13:19:15 EDT) многофункциональный бинарный файл.

Использование: date [OPTIONS] [+FMT] [TIME]

Отобразить время (используя +FMT) или установить время

[-s,--set] TIME Установить время на TIME
-u,--utc Работать в UTC (не конвертировать в местное время)
-R,--rfc-2822 Выводить строку даты, соответствующую RFC-2822
-I[SPEC] Выводить строку даты, соответствующую ISO-8601 SPEC='date' (по умолчанию) только для даты, 'hours', 'minutes' или 'seconds' для даты и времени с указанной точностью
-r,--reference FILE Отобразить время последнего изменения FILE
-d,--date TIME Отобразить TIME, а не 'now'
-D FMT Использовать FMT для преобразования TIME в -d

Признаваемые форматы TIME: hh:mm[:ss] [YYYY.]MM.DD-hh:mm[:ss] YYYY-MM-DD hh:mm[:ss] [[[[[YY]YY]MM]DD]hh]mm[.ss] форма 'date TIME' принимает MMDDhhmm[[YY]YY][.ss] вместо

Другой вариант:

date -s “$(wget -qSO- –max-redirect=0 startpage.com 2>&1 | grep Date: | cut -d’ ‘ -f5-8)”

дает: date: неверная дата ’13 мая 2018 22:46:44′

Время, полученное из первых двух результатов, например:
“Сб, 12 мая 2018 18:49:18 GMT”
и date -s требует чего-то более похожего на
2018-05-12 18:49:18
Или как указано под “признаваемыми форматами времени.”

Это близко. Но “Сб,” нужно убрать, месяц нужно заменить на число, а затем правильно расположить; Если это можно сделать исключительно в одной терминальной команде, это было бы замечательно.

Благодаря Twiglets

Вот альтернатива, которая УСТАНОВЛИВАЕТ дату !!! [-s опция].
Выводит ‘Date’, которую она получает, и ‘Date’, который установлен для сравнения.

Это работает на AsusWRT / Merlin, единственное странное, что полученная дата “…. GMT”, а утилита даты устанавливает правильное время, но изменяет его на “… DST”
Окружение имеет TZ, установленное на “GMT”

datetext=$(curl -I 'https://1.1.1.1/' 2>/dev/null | grep "Date:" |sed 's/Date: [A-Z][a-z][a-z], //g'| sed 's/\r//') ; echo "Дата получена = $datetext" ; echo -n "Дата установлена = " ; date -s "$datetext" -D'%d %b %Y %T %Z'

Ответ или решение

Установка даты и времени на роутере с использованием заголовка HTTP через curl или wget

В условиях, когда доступ к стандартному протоколу NTP (Network Time Protocol) ограничен или заблокирован, установка актуального времени на роутере может быть достигнута с использованием HTTP-заголовков. Один из наиболее эффективных способов сделать это – извлечение информации о времени из заголовков HTTP с помощью командных утилит curl или wget. Рассмотрим, как это можно реализовать с помощью команды, используя возможности оболочки Linux.

Описание задачи

Задача заключается в извлечении даты из заголовка HTTP ответа, которая затем будет преобразована в формат, пригодный для установки времени на роутере. Дата, полученная из заголовка, часто имеет вид: Sat, 12 May 2018 18:49:18 GMT, тогда как для установки времени требуется соответствующий формат, например: 2018-05-12 18:49:18.

Решение

Вот итоговая команда, которая позволяет выполнить данную задачу в одном терминальном выражении.

date -s "$(curl -I 'https://example.com' 2>/dev/null | grep -i '^date:' | sed 's/^Date: //; s/,//; s/Jan/01/; s/Feb/02/; s/Mar/03/; s/Apr/04/; s/May/05/; s/Jun/06/; s/Jul/07/; s/Aug/08/; s/Sep/09/; s/Oct/10/; s/Nov/11/; s/Dec/12/; s/  / /g; s/ GMT//; s/ /-/g')"

Объяснение команды

  1. curl -I ‘https://example.com: Выполняет HTTP запрос к указанному адресу (замените example.com на необходимый вам адрес). Опция -I позволяет получить только заголовки ответа.

  2. 2>/dev/null: Перенаправляет стандартный поток ошибок в /dev/null, что помогает избежать вывода ненужной информации в случае ошибки.

  3. grep -i ‘^date:’: Извлекает строку, содержащую дату. Используйте -i для игнорирования регистра, это полезно для обеспечения совместимости с различными серверами.

  4. sed ‘s/^Date: //; …’: Набор команд sed, выполняющий:

    • Удаление префикса Date:.
    • Удаление запятой после дня недели.
    • Замена сокращений месяцев на числовой формат.
    • Удаление лишних пробелов и символов GMT.
    • Преобразование пробелов в тире для соответствия формату yyyy-mm-dd.
  5. date -s …: Устанавливает извлечённую и отформатированную дату и время на роутере.

Примечания

  • Убедитесь, что у вас есть права на изменение системного времени на роутере. Для этого вам могут понадобиться права администратора.
  • Если на роутере установлено программное обеспечение, которое не поддерживает стандартные функции date, возможно, потребуется использовать другие утилиты, доступные в вашей среде.
  • Указанный способ извлечения даты будет работать только в случае доступности интернет-соединения.

Заключение

При отсутствии доступа к синхронизации времени через NTP серверы, установка времени через HTTP-заголовки является действенным и простенным решением. С помощью команды, описанной выше, можно легко поддерживать актуальное время на роутере, что особенно важно для правильной работы сетевых служб и безопасности. Обязательно протестируйте приведённый код в своей среды, возможно, потребуется небольшая настройка в зависимости от специфики вашего оборудования.

Оцените материал
Добавить комментарий

Капча загружается...