Jak poznać aktualny czas z Internetu z wiersza poleceń w systemie Linux?

26

Jak poznać aktualny czas z Internetu z wiersza poleceń w systemie Linux?

Na przykład z ntpqprogramem?

Uwaga: nie z zegara komputera lub systemu operacyjnego, ale z Internetu?

Uwaga: nie chcę ZMIENIAĆ ani synchronizować czasu. POZNAJ to.

Przyciemnia
źródło
powiązane: unix.stackexchange.com/questions/79112/...
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

30

Jeśli użyjesz bash, następujący wiersz wykona zadanie

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

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

Wykorzystuje wbudowane możliwości sieciowe¹ powłoki bash. Jeśli używasz powłoki POSIX lub innej powłoki, możesz użyć np . Netcat.

$ nc time.nist.gov 13

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

Oba polecenia odpytują serwer timera na porcie TCP 13 Narodowego Instytutu Standardów i Technologii i wysyłają otrzymane dane na standardowe wyjście.

¹ EDYCJA: Ze strony podręcznika użytkownika Bash: Bash obsługuje wiele nazw plików, szczególnie gdy są one używane w przekierowaniach, jak opisano w poniższej tabeli:

/dev/tcp/host/port
Jeśli host jest poprawną nazwą hosta lub adresem internetowym, a port jest liczbą całkowitą lub nazwą usługi, bash próbuje otworzyć połączenie TCP z odpowiednim gniazdem.

/dev/udp/host/port
Jeśli host jest prawidłową nazwą hosta lub adresem internetowym, a port jest liczbą całkowitą lub nazwą usługi, bash próbuje otworzyć połączenie UDP z odpowiednim gniazdem.

Marco
źródło
Fajnie, +1. Czy mógłbyś się trochę dowiedzieć, jak to działa? Lub, skoro wydaje mi się, że brakuje mi tutaj dużej wiedzy na temat bashów, podaj mi nazwę, dzięki której sprawdzę to zachowanie? Jaki jest </dev/tcp/format
terdon
Dwie niewielkie wady, które dostrzegam w tym podejściu, polegają na tym, że różne strefy czasowe nie są łatwo obsługiwane i żaden format nie może być określony w prosty sposób. Aby temu zaradzić, można użyć interfejsu API czasu . Na przykład, aby zapytać o rzeczywistą godzinę dla Europy Środkowej w bardziej czytelny dla człowieka sposób, wystarczy curl -G --data-urlencode "format=%D-%T\n" http://www.timeapi.org/cet/now?
przywołać
Nie jestem pewien, czy time.nist.gov ma jakieś ograniczenia lub jest przeciążony, ale otrzymuję różne wyniki z tym hostem.
Snowcrash
22

Istnieje kilka usług NTP dostępnych dla każdej dystrybucji.

Jeśli chcesz zrobić synchronizację czasową :

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

Ustaw czas systemowy na sprzętowy zegar czasu rzeczywistego

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

(Uwaga: tak się dzieje, że działa dobrze z Google, ponieważ mają one wszystkie serwery)


Jeśli chcesz zobaczyć, o której godzinie najbliższy serwer Google wysyła:

date -d "$(curl -s --head http://google.com | grep ^Date: | sed 's/Date: //g')"
tylko przeglądam
źródło
17

ntpdateKomenda może to zrobić z -qflagą:

$ 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

Od man ntpdate:

   -q     Query only - don't set the clock.
terdon
źródło
0

Możesz również uzyskać czas przez Internet za pomocą protokołu HTTP za pomocą protokołu HTP, który jest dostępny w wielu systemach, ponieważ htpdatezwykle ma dokładność z dokładnością do najbliższej sekundy, lub możesz go uzyskać za pomocą protokołu TLS, tlsdatektóry może zapewnić lepszą dokładność:

tlsdate -nV google.com

Ponieważ ntpdate jest przestarzałe, możesz go użyć sntp(jest on instalowany domyślnie na MacOS i wchodzi w skład dystrybucji ntp), aby uzyskać dokładniejszą datę:

sntp pool.ntp.org 
Pierz
źródło