Come usare ntpdate dietro un proxy?


49

È possibile utilizzare ntpdate dietro un proxy HTTP con autenticazione? Nel caso in cui non fosse possibile, ci sono buone alternative?


Quale sistema operativo per favore?
KCotreau,

Linux nel mio caso (non credo che importi molto però).
Ton van den Heuvel,

Importava solo perché era più difficile trovare qualcosa da remoto per Windows. La ricerca chiave che ho usato era "NTP su HTTP", nel caso in cui si desideri effettuare ulteriori ricerche.
KCotreau,

3
Se sei dietro un proxy HTTP, probabilmente significa che sei in una società e questa società potrebbe fornire i propri servizi NTP.
Tristan,

Risposte:


29

Questo sembra un chiaro caso per 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.

Non credo di aver mai visto così tanti consigli su come utilizzare i dati non autorizzati da Internet come argomento per una chiamata sudo.

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


1
Questa risposta dovrebbe davvero essere al top.
Pi Delport,

Non sono riuscito a farlo funzionare - con ogni combinazione stampa errori sui ticker falsi. wget la risposta qui sotto funziona.
Ciao-angelo,

L'ho risolto su una macchina Centos6.9 ma senza gioia. Sembra più salutare di altri consigli, ma non è banale farlo funzionare ...
Alfabravo

46

Ampliare la risposta di 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/,//')"

Attenzione, questo creerebbe il file 'index.html *' nella directory corrente.
reno

Si noti che la versione breve dovrebbe utilizzare www.google.com poiché google.com sta reindirizzando ad esso tramite 301 ora con la data "bloccata"
Hansi

Quando ho fatto il commento, la risposta per quel comando è tornata indietro di quattro giorni.
Hansi,

@ryenus Questa è un'ottima risposta. Funziona perfettamente. Tuttavia ho un problema quando inserisco questo comando in un processo crontab. La parte dell'ora della data viene effettuata 00:00:00 ogni volta che questo lavoro viene eseguito. Ho provato a correre in uno script di shell. Stesso risultato
Huzeyfe,

@huzeyfe, per favore controlla se passare il proxy per arricciare funziona?
reno il

21

Una fodera

Supponendo che la variabile di ambiente http_proxysia già impostata :

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

possiamo verificare prima la data / ora recuperata:

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

Appunti

Solo nel caso, alcune opzioni potrebbero essere necessari per curl:

  • curl -x $proxy

    per impostare esplicitamente il server proxy in modo che utilizzi, quando la http_proxyvariabile di ambiente non è impostata, impostazione predefinita su protocollo httpe porta 1080 ( manuale ).

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

    per disabilitare esplicitamente la memorizzazione nella cache , specialmente se utilizzata in un processo cron e / o dietro un server proxy.

Modulo alternativo testato con RHEL 6 che utilizza fino a oggi l'opzione '-u' invece di aggiungere la "Z" all'output:

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

A proposito, google.comè preferito rispetto www.google.com, perché il primo si traduce in una 301risposta di reindirizzamento, che è molto più piccola ( 569vs 20k+caratteri) ma comunque buona da usare.


sudo date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"
reno il

^ sopra è la wgetversione, anche se personalmente preferisco usare curl.
reno il

2
Passare dati non autorizzati da Internet come variabile a una chiamata sudo? È il 1999?
dfc,

2
O semplicemente usa tlsdate e non fare affidamento su kludges cattivi come questo.
dfc,

sì, funziona con i proxy. Ho letto anche la domanda.
dfc,

5

Se è puramente un proxy HTTP, utilizza la porta 80, quindi la risposta di base è no a quella specifica. NTP utilizza la porta UDP 123. Se si tratta di un server proxy più generico, che serve tutte le porte, forse.

Ci sono alcuni programmi là fuori che fanno NTP su HTTP. Non uso Linux, ma questo potrebbe farlo:

http://www.rkeene.org/oss/htp/ (ancora non sono sicuro se anche questo farà l'autenticazione).

Non sono riuscito a trovarne uno per Windows, ma lo invierò nuovamente.


Ancora una volta per Linux, quindi non posso aggiungere altro che un link: mina86.com/2010/01/16/ntp-over-http Potrebbe esserci anche qualcosa che uno di questi pubblica: nist.gov/pml/div688/grp40/ softwarelist.cfm
KCotreau,

Il collegamento NTP su HTTP è stimolante, grazie per quello!
Ton van den Heuvel,

5

Una soluzione rapida e sporca per le persone dietro un server proxy http:

La mia posizione è GMT + 4, posso controllare l'ora corrente dal server Timeapi con l'URL http://www.timeapi.org/utc/in+four+hours , per maggiori informazioni, visita il sito web della tua posizione.

Per impostare la data e l'ora che faccio:

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

Puoi ripetere il comando se il comando iniziale "time" indica un valore elevato ...


Grazie per il suggerimento, l'ho ancora più semplice: sudo date -s "$(curl -s http://www.timeapi.org/utc/now)"non è necessario prestare attenzione al fuso orario se il sistema operativo è impostato correttamente. Linux riconosce il fuso orario fornito nella stringa e imposta l'ora di sistema in modo appropriato.
Melebio

2

Il servizio NTP utilizza il protocollo UDP per sincronizzare l'ora. Quindi il proxy HTTP / TCP potrebbe non funzionare per questo. In alternativa alla risposta accettata, esiste un buon strumento htpdate per sincronizzare il tempo dietro il proxy.

Un esempio di cron job:

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

2

Sebbene sia stato menzionato ntp su http, sono sorpreso che nessuno abbia menzionato l'utile piccola utilità htpdatedisponibile su http://www.vervest.org/htp/ . A differenza delle alternative, htpdatefa parte dei repository predefiniti di Debian e Ubuntu e può essere installato usando apt-get.

Può essere eseguito sia come un normale comando o silenziosamente in modalità demone.


Controlla la mia risposta sopra.
artificerpi,

1

Supponendo che la http_proxyvariabile di ambiente sia impostata:

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

Oppure usa curl -I --proxy="..." "http://www.google.com/"

Dopotutto, se il sito di Google non ha il suo tempo impostato, non c'è speranza.


1

Espandibile su https://superuser.com/a/509620/362156

Supponiamo che tu sia a Berlino (Germania).

Quindi usa questo:

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/,//')")"

Dovresti spiegare cosa c'è di diverso nella tua soluzione rispetto alla risposta di fiford_g.
pabouk,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.