Вопрос или проблема
Как узнать текущее время из Интернета через командную строку в 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, не изменяя при этом системное время. Выбор метода зависит от ваших предпочтений и доступности утилит. Каждый из предложенных инструментов предоставляет разные уровни точности и надежности, поэтому тестируйте несколько из них, чтобы найти наиболее подходящий для ваших нужд.