Wie verwende ich ntpdate hinter einem Proxy?

49

Ist es möglich, ntpdate hinter einem HTTP-Proxy mit Authentifizierung zu verwenden? Falls es nicht möglich ist, gibt es gute Alternativen?

Ton van den Heuvel
quelle
Welches Betriebssystem bitte?
KCotreau
Linux in meinem Fall (glaube aber nicht, dass es wichtig ist).
Ton van den Heuvel
Es war nur wichtig, weil es für Windows schwieriger war, etwas aus der Ferne zu finden. Die von mir verwendete Schlüsselsuche war "NTP über HTTP", falls Sie weiter suchen möchten.
KCotreau
3
Wenn Sie sich hinter einem HTTP-Proxy befinden, bedeutet dies wahrscheinlich, dass Sie sich in einem Unternehmen befinden und dieses Unternehmen möglicherweise seine eigenen NTP-Dienste bereitstellt.
Tristan

Antworten:

29

Dies scheint ein klarer Fall für tlsdate zu sein.

 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.

Ich glaube nicht, dass ich jemals so viele Empfehlungen gesehen habe, nicht bereinigte Daten aus dem Internet als Argument für einen Sudo-Aufruf zu verwenden.

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

dfc
quelle
1
Diese Antwort sollte wirklich ganz oben stehen.
Pi Delport
Ich habe es nicht geschafft, es zum Laufen zu bringen - bei jeder Kombination werden Fehler über falsche Ticker ausgegeben. wget Antwort unten funktioniert.
Hi-Angel
Habe es auf einem Centos6.9-Rechner ausprobiert, aber keine Freude. Dies scheint gesünder zu sein als andere Empfehlungen, aber es ist nicht trivial, es zum
Laufen
46

Erweiterung der Antwort von 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
quelle
Achtung, dies würde die Datei 'index.html *' im aktuellen Verzeichnis erzeugen.
Ryenus
Beachten Sie, dass die Kurzversion www.google.com verwenden sollte, da google.com jetzt mit dem Datum "stecken geblieben"
Hansi
Als ich den Kommentar abgab, kam die Antwort für diesen Befehl vier Tage veraltet zurück.
Hansi
@ryenus Dies ist eine großartige Antwort. Es funktioniert einwandfrei. Ich habe jedoch ein Problem, wenn ich diesen Befehl in einen Crontab-Job einbaue. Der Zeitanteil des Datums wird bei jeder Ausführung dieses Jobs auf 00:00:00 festgelegt. Ich habe versucht, ein Shell-Skript auszuführen. Gleiches Ergebnis.
Huzeyfe
@huzeyfe, würdest du bitte prüfen, ob die Weitergabe des Proxy an curl funktioniert?
Ryenus
21

Einzeiler

Angenommen, die Umgebungsvariable http_proxyist bereits festgelegt :

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

Wir können zuerst das abgerufene Datum und die Uhrzeit überprüfen:

# 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)"    

Anmerkungen

Für den Fall, dass bestimmte Optionen benötigt werden curl:

  • curl -x $proxy

    Zum expliziten Festlegen des Proxy-Servers, der verwendet wird, wenn die http_proxyUmgebungsvariable nicht festgelegt ist, werden standardmäßig Protokoll httpund Port 1080 ( manuell ) verwendet.

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

    um das Caching explizit zu deaktivieren , insbesondere wenn es in einem Cron-Job und / oder hinter einem Proxy-Server verwendet wird.

Alternative Form, die mit RHEL 6 getestet wurde und die bisher die Option '-u' verwendet, anstatt das "Z" an die Ausgabe anzuhängen:

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

BTW, google.comwird bevorzugt über www.google.com, weil die früheren Ergebnisse in einer 301Umleitungsantwort, die viel kleiner ist ( 569vs 20k+Zeichen) , aber immer noch gut zu bedienen.

ryenus
quelle
sudo date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"
Ryenus
^ oben ist die wgetVersion, obwohl ich persönlich lieber benutze curl.
Ryenus
2
Unbereinigte Daten aus dem Internet als Variable an einen Sudo-Aufruf übergeben? Ist es 1999?
DFC
2
Oder verwende einfach tlsdate und verlasse dich nicht auf so üble Klamotten.
DFC
Ja, es funktioniert mit Proxies. Ich habe die Frage auch gelesen.
DFC
5

Wenn es sich lediglich um einen HTTP-Proxy handelt, wird Port 80 verwendet. Die grundlegende Antwort lautet also Nein. NTP verwendet den UDP-Port 123. Wenn es sich um einen allgemeineren Proxy-Server handelt, der alle Ports bedient, ist dies möglicherweise der Fall.

Es gibt einige Programme, die NTP über HTTP ausführen. Ich benutze kein Linux, aber dieses könnte es tun:

http://www.rkeene.org/oss/htp/ (immer noch nicht sicher, ob dies auch zur Authentifizierung führt).

Ich konnte keine für Windows finden, aber ich werde zurückschicken, wenn ich es tue.

KCotreau
quelle
Wieder für Linux, daher kann ich nur einen Link hinzufügen: mina86.com/2010/01/16/ntp-over-http Es könnte auch etwas geben, das einer von diesen veröffentlicht: nist.gov/pml/div688/grp40/ softwarelist.cfm
KCotreau
Der NTP über HTTP-Link ist inspirierend, danke dafür!
Ton van den Heuvel
5

Eine schnelle und schmutzige Lösung für Leute hinter einem HTTP-Proxy-Server:

Mein Standort ist GMT + 4. Ich kann die aktuelle Uhrzeit vom timeapi-Server über die URL http://www.timeapi.org/utc/in+four+hours abrufen. Weitere Informationen erhalten Sie auf der Website Ihres Standorts.

So richten Sie Datum und Uhrzeit ein:

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 " " )

Sie können den Befehl wiederholen, wenn der anfängliche Befehl 'time' einen hohen Wert meldet ...

Mehdi Amiri
quelle
Vielen Dank für den Tipp, ich habe es noch einfacher: sudo date -s "$(curl -s http://www.timeapi.org/utc/now)"Sie müssen nicht auf die Zeitzone achten, wenn Ihr Betriebssystem richtig eingestellt ist. Linux erkennt die in der Zeichenfolge angegebene Zeitzone und stellt die Systemzeit entsprechend ein.
Melebius
2

Der NTP-Dienst verwendet das UDP-Protokoll, um die Uhrzeit zu synchronisieren. Daher funktioniert der HTTP / TCP-Proxy möglicherweise nicht. Alternativ zur akzeptierten Antwort gibt es ein gutes HTPdate- Tool, um die Zeit hinter dem Proxy zu synchronisieren.

Ein Cron Job Beispiel:

* 3 * * * /usr/bin/htpdate -s -P <PROXY_HOST>:<PROXY__PORT> www.linux.org www.freebsd.org
artificerpi
quelle
2

Obwohl ntp über http erwähnt wurde, wundert es mich, dass niemand das kleine Hilfsprogramm erwähnt hat, das htpdateauf http://www.vervest.org/htp/ verfügbar ist . Im Gegensatz zu den Alternativen gehört htpdatees zu den Standard-Repositorys von Debian und Ubuntu und kann mit installiert werden apt-get.

Es kann sowohl als normaler Befehl als auch unbeaufsichtigt im Dämonmodus ausgeführt werden.

nicht deterministisch
quelle
Überprüfen Sie meine Antwort oben.
artificerpi
1

Angenommen, die http_proxyUmgebungsvariable ist gesetzt:

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

Oder benutze curl -I --proxy="..." "http://www.google.com/"

Wenn für die Website von Google keine Zeit festgelegt ist, gibt es schließlich keine Hoffnung.

Carveone
quelle
1

Einblenden von https://superuser.com/a/509620/362156

Nehmen wir an, Sie sind in Berlin (Deutschland).

Dann benutze dies:

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
quelle
Sie sollten erklären, was in Ihrer Lösung im Vergleich zur Antwort von fiford_g anders ist.
Pabouk
0

Eine voll funktionsfähige vorgefertigte Implementierung der hervorragenden Antwort von @ryenus finden Sie in set_system_clock_from_google.sh .

Jay Taylor
quelle