Jak korzystać z ntpdate za serwerem proxy?

49

Czy można używać ntpdate za proxy HTTP z uwierzytelnianiem? Jeśli nie jest to możliwe, czy są jakieś dobre alternatywy?

Ton van den Heuvel
źródło
Jaki system operacyjny proszę?
KCotreau,
Linux w moim przypadku (choć nie sądzę, że ma to duże znaczenie).
Ton van den Heuvel
Miało to znaczenie tylko dlatego, że trudniej było znaleźć coś zdalnie dla systemu Windows. Użyłem kluczowego wyszukiwania „NTP przez HTTP”, na wypadek, gdybyś chciał szukać dalej.
KCotreau
3
Jeśli jesteś za serwerem proxy HTTP, prawdopodobnie oznacza to, że jesteś w firmie, która może świadczyć własne usługi NTP.
Tristan

Odpowiedzi:

29

Wydaje się to oczywistym argumentem dla tlsdate.

 tlsdate: secure parasitic rdate replacement

  tlsdate sets the local clock by securely connecting with TLS to remote
  servers and extracting the remote time out of the secure handshake. Unlike
  ntpdate, tlsdate uses TCP, for instance connecting to a remote HTTPS or TLS
  enabled service, and provides some protection against adversaries that try
  to feed you malicious time information.

Nie sądzę, że kiedykolwiek widziałem tak wiele rekomendacji, aby wykorzystywać niezarządzane dane z Internetu jako argument do wywołania sudo.

Github: https://github.com/ioerror/tlsdate

dfc
źródło
1
Ta odpowiedź powinna być naprawdę na górze.
Pi Delport,
Nie udało mi się go uruchomić - przy każdej kombinacji drukuje błędy dotyczące fałszywych pasków. Odpowiedź wget poniżej działa.
Cześć Anioł
Pracowałem nad tym na maszynie Centos6.9, ale bez radości. Wydaje się to zdrowsze niż inne zalecenia, ale nie jest trywialne, aby działało ...
Alfabravo
46

Rozszerzenie odpowiedzi przez carveone :

sudo date -s "$(wget -S  "http://www.google.com/" 2>&1 | grep -E '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//' | head -1l | awk '{print $1, $3, $2,  $5 ,"GMT", $4 }' | sed 's/,//')"
fiford_g
źródło
Uwaga, spowoduje to utworzenie pliku „index.html *” w bieżącym katalogu.
ryenus
Pamiętaj, że krótka wersja powinna korzystać z www.google.com, ponieważ google.com przekierowuje na nią teraz za pośrednictwem 301 z datą „utknął”
Hansi
Kiedy skomentowałem, odpowiedź na to polecenie wróciła o cztery dni od daty.
Hansi
@ryenus To świetna odpowiedź. Działa idealnie dobrze. Mam jednak problem, gdy umieszczam to polecenie w zadaniu crontab. Część czasu jest wykonywana 00:00:00 przy każdym uruchomieniu tego zadania. Próbowałem uruchomić w skrypcie powłoki. Ten sam wynik.
huzeyfe
@huzeyfe, czy mógłbyś sprawdzić, czy przekazywanie proxy do curl działa?
ryenus
21

Jedna wkładka

Zakładając, że zmienna środowiskowa http_proxyjest już ustawiona :

sudo date -s "$(curl -H'Cache-Control:no-cache' -sI google.com | grep '^Date:' | cut -d' ' -f3-6)Z"

najpierw możemy zweryfikować pobraną datę / godzinę:

# local  date/time
date -d "$(curl -HCache-Control:no-cache -sI google.com | grep '^Date:' | cut -d' ' -f3-6)Z"

# or UTC date/time
date -ud "$(curl -HCache-Control:no-cache -sI google.com | grep '^Date:' | cut -d' ' -f3-6)"    

Notatki

Na wszelki wypadek niektóre opcje mogą być potrzebne do curl:

  • curl -x $proxy

    jawne ustawienie używania serwera proxy, gdy http_proxyzmienna środowiskowa nie jest ustawiona, domyślnie protokół httpi port 1080 ( ręcznie ).

  • curl -H 'Cache-Control: no-cache'

    aby jawnie wyłączyć buforowanie , szczególnie gdy jest używane w zadaniu cron i / lub za serwerem proxy.

Alternatywna forma przetestowana z RHEL 6, która używa do tej pory opcji „-u” zamiast dołączania „Z” do wyniku:

sudo date -u --set="$(curl -H 'Cache-Control: no-cache' -sD - http://google.com |grep '^Date:' |cut -d' ' -f3-6)"

BTW google.comjest bardziej preferowane niż pierwsze www.google.com, ponieważ pierwsze powoduje 301reakcję przekierowania, która jest znacznie mniejsza (w 569porównaniu z 20k+postaciami), ale nadal dobra w użyciu.

ryenus
źródło
sudo date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"
ryenus
^ powyżej jest wgetwersją, chociaż osobiście wolę używać curl.
ryenus
2
Przekazywanie niezarządzanych danych z Internetu jako zmiennej do wywołania sudo? Czy to 1999?
dfc,
2
Lub po prostu użyj tlsdate i nie polegaj na takich paskudnych kludges.
dfc,
tak, działa z serwerami proxy. Też czytam pytanie.
dfc,
5

Jeśli jest to wyłącznie serwer proxy HTTP, używa portu 80, więc podstawowa odpowiedź brzmi „nie”. NTP używa portu UDP 123. Jeśli jest to bardziej ogólny serwer proxy obsługujący wszystkie porty, być może.

Istnieje kilka programów, które wykonują NTP przez HTTP. Nie używam Linuksa, ale ten może to zrobić:

http://www.rkeene.org/oss/htp/ (wciąż nie jestem pewien, czy to spowoduje uwierzytelnienie).

Nie mogłem znaleźć jednego dla systemu Windows, ale jeśli to zrobię, wyślę go ponownie.

KCotreau
źródło
Znowu dla Linuksa, więc nie mogę dodać wiele innych niż link: mina86.com/2010/01/16/ntp-over-http Może być też coś, co jedna z tych publikacji: nist.gov/pml/div688/grp40/ softwarelist.cfm
KCotreau
Link NTP przez HTTP jest inspirujący, dzięki za to!
Ton van den Heuvel
5

Szybkie i brudne rozwiązanie dla osób stojących za serwerem proxy HTTP:

Moja lokalizacja to GMT + 4, mogę sprawdzić aktualny czas z serwera timeapi za pomocą adresu URL http://www.timeapi.org/utc/in+four+hours , aby uzyskać więcej informacji , proszę sprawdzić stronę internetową swojej lokalizacji.

Aby ustawić datę i godzinę, robię:

time sudo date $(wget -O - "http://www.timeapi.org/utc/in+four+hours" 2>/dev/null | sed s/[-T:+]/\ /g | awk '{print $2,$3,$4,$5,".",$6}' | tr -d " " )

Możesz powtórzyć polecenie, jeśli początkowe polecenie „czas” zgłasza wysoką wartość ...

Mehdi Amiri
źródło
Dzięki za wskazówkę, stało się to jeszcze łatwiejsze: sudo date -s "$(curl -s http://www.timeapi.org/utc/now)"Nie musisz zwracać uwagi na strefę czasową, jeśli Twój system operacyjny jest ustawiony poprawnie. Linux rozpoznaje strefę czasową podaną w ciągu i odpowiednio ustawia czas systemowy.
Melebius
2

Usługa NTP używa protokołu UDP do synchronizacji czasu. Dlatego proxy HTTP / TCP może nie działać. Alternatywą dla zaakceptowanej odpowiedzi jest dobre narzędzie htpdate do synchronizacji czasu za serwerem proxy.

Przykład pracy crona:

* 3 * * * /usr/bin/htpdate -s -P <PROXY_HOST>:<PROXY__PORT> www.linux.org www.freebsd.org
artificerpi
źródło
2

Chociaż wspomniano o ntp nad http, dziwi mnie to, że nikt nie wspominał o fajnym małym narzędziu htpdatedostępnym na http://www.vervest.org/htp/ . W przeciwieństwie do alternatyw, htpdatejest częścią domyślnych repozytoriów Debiana i Ubuntu i może być zainstalowany przy użyciu apt-get.

Może być uruchamiany zarówno jako zwykłe polecenie, jak i po cichu w trybie demona.

niedeterministyczny
źródło
Sprawdź moją odpowiedź powyżej.
artificerpi
1

Zakładając, że http_proxyzmienna środowiskowa jest ustawiona:

wget -S --spider "http://www.google.com/" 2>&1 | grep -E '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//'

Albo użyj curl -I --proxy="..." "http://www.google.com/"

W końcu jeśli witryna Google nie ma ustawionego czasu, nie ma nadziei.

carveone
źródło
1

Rozszerzanie na https://superuser.com/a/509620/362156

Załóżmy, że jesteś w Berlinie (Niemcy).

Następnie użyj tego:

sudo TZ=Europe/Berlin date -s "$(TZ=Europe/Berlin date --date='TZ="UTC" '"$(wget -S  "http://www.google.com/" 2>&1 | grep -E '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//' | head -1l | awk '{print $1, $3, $2,  $5 , $6, $4 }' | sed 's/,//')")"
PeterZ
źródło
Powinieneś wyjaśnić, co różni się w twoim rozwiązaniu w porównaniu z odpowiedzią autorstwa fiford_g.
pabouk