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/,//')"
Ist es möglich, ntpdate mit Authentifizierung hinter einem HTTP-Proxy zu verwenden? Gibt es gute Alternativen, falls dies nicht möglich ist?
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/,//')"
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.
Angenommen, die Umgebungsvariable http_proxy
ist 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"
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_proxy
nicht festgelegt, Standardwert für Protokoll http
und 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.com
wird bevorzugt über www.google.com
, weil die früheren Ergebnisse in einer 301
Umleitungsantwort, die viel kleiner ist ( 569
vs 20k+
Zeichen), aber immer noch gut zu bedienen.
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.
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 ...
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.
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/,//')")"
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
Eine vollständig funktionierende, vorgebackene Implementierung der @ryenus 'hervorragenden Antwort finden Sie unter set_system_clock_from_google.sh .