Wie verwende ich ntpdate hinter einem Proxy?

56071
Ton van den Heuvel

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

44
Welches Betriebssystem bitte? KCotreau vor 12 Jahren 0
Linux in meinem Fall (glaube aber nicht, dass es wichtig ist). Ton van den Heuvel vor 12 Jahren 0
Es war nur wichtig, weil es schwieriger war, für Windows etwas aus der Ferne zu finden. Die Schlüsselsuche, die ich verwendet habe, war "NTP über HTTP", falls Sie weiter suchen möchten. KCotreau vor 12 Jahren 0
Wenn Sie sich hinter einem HTTP-Proxy befinden, bedeutet dies wahrscheinlich, dass Sie sich in einem Unternehmen befinden und dieses Unternehmen bietet möglicherweise eigene NTP-Dienste an. Tristan vor 7 Jahren 3

9 Antworten auf die Frage

43
fiford_g

Expanding on the answer by 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 '' | sed 's/,//')" 
Achtung, dies würde die Datei 'index.html *' im aktuellen Verzeichnis erstellen. ryenus vor 10 Jahren 0
Beachten Sie, dass die Kurzversion www.google.com verwenden sollte, da google.com jetzt über 301 mit dem Datum "hängen bleibt". Hansi vor 10 Jahren 0
Als ich den Kommentar machte, gab die Antwort für diesen Befehl einen Tag zurück, der vier Tage veraltet war. Hansi vor 9 Jahren 0
@ryenus Dies ist eine großartige Antwort. Es funktioniert perfekt. Ich habe jedoch ein Problem, wenn ich diesen Befehl in einem Crontab-Job einsetze. Datumszeitpunkt wird bei jeder Ausführung dieses Jobs um 00:00:00 Uhr gemacht. Ich habe versucht, ein Shell-Skript auszuführen. Gleiches Ergebnis huzeyfe vor 9 Jahren 0
@Hezeyfe, würden Sie bitte prüfen, ob [das Weiterleiten von Proxy] (http://superuser.com/questions/307158/how-to-use-ntpdate-behind-a-proxy/807326#807326) funktioniert? ryenus vor 9 Jahren 0
25
dfc

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, unbenutzte Daten aus dem Internet als Argument für einen Sudo-Aufruf zu verwenden.

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

Diese Antwort sollte wirklich ganz oben stehen. Pi Delport vor 8 Jahren 1
Ich habe es nicht geschafft, es zum Laufen zu bringen - mit jeder Kombination werden Fehler über falsche Ticker ausgegeben. Wget Antwort unten funktioniert. Hi-Angel vor 7 Jahren 0
Habe es auf einer Centos6.9-Maschine erarbeitet, aber keine Freude. Dies scheint gesünder als andere Empfehlungen zu sein, aber es ist nicht trivial, es zum Laufen zu bringen ... Alfabravo vor 5 Jahren 0
18
ryenus

Einzeiler

Angenommen, die Umgebungsvariable http_proxyist bereits festgelegt :

sudo date -s "$(curl -sD - google.com | grep '^Date:' | cut -d' ' -f3-6)Z" 

Um sicherzugehen, was übergeben wird sudo date -s, führen Sie einfach den curl ...Teil des Befehls aus, um die Ausgabe anzuzeigen:

curl -sD - google.com | grep '^Date:' | cut -d' ' -f3-6 

Oder eine sicherere Version, die die Ausgabelänge von überprüft curl:

date_utc=$(curl -sD - google.com | grep '^Date:' | cut -d' ' -f3-6)  [ -n "$date_utc" ] && sudo date -s "$Z" 

Anmerkungen

Für den Fall, dass bestimmte Optionen erforderlich sein könnten curl:

  • curl -x $proxy

    um den zu verwendenden Proxyserver explizit festzulegen, erforderlich, falls http_proxynicht festgelegt, Standardwert für Protokoll httpund Port 1080 ( manuell ).

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

    die Zwischenspeicherung explizit zu deaktivieren, insbesondere wenn sie in einem cron-Job und / oder hinter einem Proxy-Server verwendet wird.

Alternatives Formular, das mit RHEL 6 getestet wurde und das 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.

`sudo date -s" $ (wget -qSO- --max-redirect = 0 google.com 2> & 1 | grep Date: | cut -d '' -f5-8) Z "` ryenus vor 9 Jahren 0
^ oben ist die "wget" -Version, obwohl ich persönlich lieber "curl" benutze. ryenus vor 9 Jahren 0
Nicht-strahlende Daten aus dem Internet als Variable an einen Sudo-Aufruf übergeben? Ist es 1999? dfc vor 9 Jahren 2
Oder verwenden Sie einfach tlsdate und verlassen Sie sich nicht auf solche unangenehmen Klicks. dfc vor 9 Jahren 2
Ja, es funktioniert mit Proxies. Ich habe auch die Frage gelesen. dfc vor 9 Jahren 0
zsh mag das grep-Muster nicht ohne Anführungszeichen; es führt zu einem (23) Fehler beim Schreiben des Textkörpers. Wenn Sie zsh verwenden, verwenden Sie also sudo date -s "$ (curl -sD - google.com | grep '^ Date:' | cut -d '' -f3-6) Z" ". Es gibt wahrscheinlich einen ZSH-Konfigurationsmodifikator, der dieses Verhalten ändert, aber ich weiß nicht, was es ist. Da es sich um eine Proxy-Nutzung handelt, scheint "google.com" von einigen Proxy-Servern zwischengespeichert zu werden (eine 301-Weiterleitung), während "www.google.com" als Live-Seite jedes Mal neu geladen wird ( und so ist der Zeitstempel genau). Ville vor 9 Jahren 0
Eine vollständig funktionsfähige vorgebackene Implementierung finden Sie unter [set_system_clock_from_google.sh] (https://gist.github.com/jaytaylor/60c8a4e22431c4271200cab68186deb7). Jay Taylor vor 5 Jahren 0
5
KCotreau

Wenn es sich nur um einen HTTP-Proxy handelt, wird Port 80 verwendet. Daher lautet die grundlegende Antwort Nein. NTP verwendet UDP-Port 123. Wenn es sich um einen generischeren Proxy-Server handelt, der alle Ports bereitstellt, dann möglicherweise.

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/ (ist immer noch nicht sicher, ob dies auch eine Authentifizierung bewirkt).

Ich konnte keine für Windows finden, aber ich werde es wieder posten.

Nochmals für Linux, also kann ich nicht viel anderes als einen Link hinzufügen: http://mina86.com/2010/01/16/ntp-over-http/ Möglicherweise gibt es auch etwas, das einer dieser veröffentlicht: http: // www .nist.gov / pml / div688 / grp40 / softwarelist.cfm KCotreau vor 12 Jahren 0
Der NTP-über-HTTP-Link ist inspirierend, danke dafür! Ton van den Heuvel vor 12 Jahren 0
5
Mehdi Amiri

Eine schnelle und schmutzige Lösung für Menschen, die sich hinter einem http-Proxy-Server befinden:

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

Um Datum und Uhrzeit einzustellen, mache ich:

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

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

Danke für den Tipp, ich habe es noch einfacher: `sudo date -s" $ (curl -s http://www.timeapi.org/utc/now) "` Sie brauchen nicht auf die Zeitzone zu achten, wenn Ihr Betriebssystem ist richtig eingestellt. Linux erkennt die in der Zeichenfolge angegebene Zeitzone und stellt die Systemzeit entsprechend ein. Melebius vor 10 Jahren 0
1
carveone

Assuming the http_proxy environment variable is set:

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

Or use curl -I --proxy="..." "http://www.google.com/"

After all, if Google's site doesn't have its time set there's no hope.

1
PeterZ

Erweiterung auf https://superuser.com/a/509620/362156

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

Dann benutze folgendes:

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 '' | sed 's/,//')")" 
Sie sollten erklären, was sich in Ihrer Lösung im Vergleich zur Antwort von fiford_g unterscheidet. pabouk vor 9 Jahren 0
1
artificerpi

Der NTP-Dienst verwendet das UDP-Protokoll zum Synchronisieren der Uhrzeit. 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 
0
Jay Taylor

Eine vollständig funktionierende, vorgebackene Implementierung der @ryenus 'hervorragenden Antwort finden Sie unter set_system_clock_from_google.sh .