Ist es möglich, ntpdate hinter einem HTTP-Proxy mit Authentifizierung zu verwenden? Falls es nicht möglich ist, gibt es gute Alternativen?
Ist es möglich, ntpdate hinter einem HTTP-Proxy mit Authentifizierung zu verwenden? Falls es nicht möglich ist, gibt es gute Alternativen?
Antworten:
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.
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/,//')"
Angenommen, die Umgebungsvariable http_proxy
ist 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)"
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_proxy
Umgebungsvariable nicht festgelegt ist, werden standardmäßig Protokoll http
und 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.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.
sudo date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"
wget
Version, obwohl ich persönlich lieber benutze curl
.
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.
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 ...
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.
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
Obwohl ntp über http erwähnt wurde, wundert es mich, dass niemand das kleine Hilfsprogramm erwähnt hat, das htpdate
auf http://www.vervest.org/htp/ verfügbar ist . Im Gegensatz zu den Alternativen gehört htpdate
es 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.
Angenommen, die http_proxy
Umgebungsvariable 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.
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/,//')")"
Eine voll funktionsfähige vorgefertigte Implementierung der hervorragenden Antwort von @ryenus finden Sie in set_system_clock_from_google.sh .