Вопрос или проблема
Эта техника должна быть похожей или такой же, как и в 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')"
Объяснение команды
-
curl -I ‘https://example.com‘: Выполняет HTTP запрос к указанному адресу (замените
example.com
на необходимый вам адрес). Опция-I
позволяет получить только заголовки ответа. -
2>/dev/null: Перенаправляет стандартный поток ошибок в
/dev/null
, что помогает избежать вывода ненужной информации в случае ошибки. -
grep -i ‘^date:’: Извлекает строку, содержащую дату. Используйте
-i
для игнорирования регистра, это полезно для обеспечения совместимости с различными серверами. -
sed ‘s/^Date: //; …’: Набор команд
sed
, выполняющий:- Удаление префикса
Date:
. - Удаление запятой после дня недели.
- Замена сокращений месяцев на числовой формат.
- Удаление лишних пробелов и символов
GMT
. - Преобразование пробелов в тире для соответствия формату
yyyy-mm-dd
.
- Удаление префикса
-
date -s …: Устанавливает извлечённую и отформатированную дату и время на роутере.
Примечания
- Убедитесь, что у вас есть права на изменение системного времени на роутере. Для этого вам могут понадобиться права администратора.
- Если на роутере установлено программное обеспечение, которое не поддерживает стандартные функции date, возможно, потребуется использовать другие утилиты, доступные в вашей среде.
- Указанный способ извлечения даты будет работать только в случае доступности интернет-соединения.
Заключение
При отсутствии доступа к синхронизации времени через NTP серверы, установка времени через HTTP-заголовки является действенным и простенным решением. С помощью команды, описанной выше, можно легко поддерживать актуальное время на роутере, что особенно важно для правильной работы сетевых служб и безопасности. Обязательно протестируйте приведённый код в своей среды, возможно, потребуется небольшая настройка в зависимости от специфики вашего оборудования.