Как узнать текущее время из интернета с помощью командной строки в Linux?

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

Как узнать текущее время из Интернета через командную строку в Linux?

Например, с помощью программы ntpq?

Не от часов компьютера или операционной системы, а из Интернета?

Я не хочу изменять или синхронизировать время. Я просто хочу его знать.

Если вы используете bash, следующая команда выполнит задачу

$ cat </dev/tcp/time.nist.gov/13

56525 13-08-21 23:07:09 50 0 0  55.6 UTC(NIST) *

Она использует встроенные сетевые возможности¹ оболочки bash. Если вы используете POSIX-оболочку или любую другую оболочку, вы можете использовать, например, netcat.

$ nc time.nist.gov 13

56525 13-08-21 23:07:09 50 0 0  55.6 UTC(NIST) *

Вы также можете использовать socat с:

$ socat stdio tcp4-connect:time.nist.gov:13

60665 24-12-21 02:29:24 00 0 0 614.7 UTC(NIST) *

Все 3 команды запрашивают таймер-сервер на TCP-порту 13 Национального института стандартов и технологий и выводят полученные данные в stdout.

¹ИЗМЕНИТЬ: Из страницы man для Bash: Bash обрабатывает несколько имен файлов особым образом, когда они используются в перенаправлениях, как описано в следующей таблице:

/dev/tcp/host/port
Если host является допустимым именем хоста или интернет-адресом, а port — целым номером порта или именем службы, bash пытается открыть TCP-соединение с соответствующим сокетом.

/dev/udp/host/port
Если host является допустимым именем хоста или интернет-адресом, а port — целым номером порта или именем службы, bash пытается открыть UDP-соединение с соответствующим сокетом.

Существует несколько NTP-сервисов, доступных для каждой дистрибуции.

Если вы хотите сделать однократную синхронизацию часов:

date -s "$(curl -s --head http://www.google.com | grep ^Date: | sed 's/Date: //g')"

Установить системное время в аппаратные часы реального времени

hwclock -r --utc
hwclock -w --utc
hwclock -r --utc

(Примечание: это хорошо работает с Google, потому что у них есть серверы по всему миру)


Если вы хотите просто увидеть, какое время отправляет ближайший сервер Google:

date -d "$(curl -s --head https://www.google.com | grep ^date: | sed 's/date: //g')"

(Обратите внимание на разный регистр d при использовании TLS и без него.)

Команда ntpdate может сделать это с помощью флага -q:

$ ntpdate -q 1.debian.pool.ntp.org
server 88.191.120.99, stratum 3, offset -0.015076, delay 0.06604
server 88.191.235.218, stratum 2, offset -0.000676, delay 0.06592
server 188.165.240.21, stratum 3, offset 0.001191, delay 0.07005
server 91.121.34.166, stratum 2, offset 0.000565, delay 0.06998
22 Aug 00:56:21 ntpdate[31373]: adjust time server 88.191.235.218 offset -0.000676 sec

Из man ntpdate:

   -q     Запросить только - не устанавливать время.

Вы также можете получить время через Интернет, используя HTTP через HTP, который доступен на многих системах как htpdate, который обычно имеет точность до ближайшей секунды, или вы можете получить его с использованием TLS через tlsdate, который может предоставить лучшую точность:

tlsdate -nV google.com

Также, поскольку ntpdate выводится из эксплуатации, вы можете использовать sntp (он установлен по умолчанию на MacOS и входит в состав дистрибутивов ntp), чтобы получить дату гораздо более точно:

sntp pool.ntp.org 

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

Чтобы узнать текущее время из интернета через командную строку в Linux, существуют несколько методов, позволяющих получить точное время без необходимости синхронизации системных часов. Рассмотрим наиболее распространенные и эффективные способы:

1. Использование Bash для открытия TCP-соединения

Bash поддерживает специальные файловые типы, такие как /dev/tcp и /dev/udp, которые могут быть использованы для открытия TCP-соединений. Для получения времени вы можете выполнить следующую команду:

cat </dev/tcp/time.nist.gov/13

Эта команда подключается к серверу времени NIST на порту 13 и выводит текущее время.

2. Использование netcat

Если Bash не поддерживает /dev/tcp, вы можете использовать утилиту netcat (или nc):

nc time.nist.gov 13

Команда будет аналогично запрашивать информацию о времени с того же сервера и выводить результат на экран.

3. Использование socat

Альтернативным вариантом является socat, который также может быть использован для создания TCP-соединений:

socat - stdio tcp4-connect:time.nist.gov:13

Это также подключится к серверу времени и выведет текущее время.

4. Получение времени с помощью HTTP-заголовков

Вы можете получить текущее время через HTTP-заголовки с любого веб-сервиса. Например, используя curl и обрабатывая заголовок Date, можно сделать это следующим образом:

date -d "$(curl -s --head http://www.google.com | grep ^Date: | sed 's/Date: //g')"

Эта команда отправляет запрос HEAD к Google и получает значение Date, которое затем используется для вывода текущего времени.

5. Использование ntpdate

Команда ntpdate с флагом -q позволяет узнать, какое время у NTP-сервера, не изменяя при этом системное время:

ntpdate -q 1.debian.pool.ntp.org

Эта команда вернет информацию о времени с указанного NTP-сервера, включая задержки и отклонения.

6. Использование tlsdate

Для более точного значения времени, с использованием TLS, вы можете применять tlsdate:

tlsdate -nV google.com

Эта команда подключается к Google и выдает значение времени, полученное с сервера, используя более защищенный протокол.

7. Использование sntp

Альтернативой ntpdate является команда sntp, которая предоставляет более точные данные о времени от NTP-серверов:

sntp pool.ntp.org

Заключение

Эти методы позволяют вам получить текущее время из интернета через командную строку в Linux, не изменяя при этом системное время. Выбор метода зависит от ваших предпочтений и доступности утилит. Каждый из предложенных инструментов предоставляет разные уровни точности и надежности, поэтому тестируйте несколько из них, чтобы найти наиболее подходящий для ваших нужд.

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

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