¿Cómo usar ntpdate detrás de un proxy?

49

¿Es posible usar ntpdate detrás de un proxy HTTP con autenticación? En caso de que no sea posible, ¿hay alguna buena alternativa?

Ton van den Heuvel
fuente
¿Qué sistema operativo por favor?
KCotreau
Linux en mi caso (aunque no creo que importe demasiado).
Ton van den Heuvel
Solo importaba porque era más difícil encontrar algo de forma remota para Windows. La búsqueda clave que utilicé fue "NTP sobre HTTP", en caso de que desee buscar más.
KCotreau
3
Si está detrás de un proxy HTTP, probablemente significa que está en una compañía, y esta compañía puede proporcionar sus propios servicios NTP.
Tristan

Respuestas:

29

Este parece ser un caso claro para 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.

No creo haber visto tantas recomendaciones para usar datos no saneados de Internet como argumento para una invocación de sudo.

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

dfc
fuente
1
Esta respuesta realmente debería estar en la parte superior.
Pi Delport
No logré que funcionara: con cada combinación imprime errores sobre falsos tickers. La respuesta de wget a continuación funciona.
Hola Angel
Lo he estado trabajando en una máquina Centos6.9 pero no es una alegría. Esto parece más saludable que otras recomendaciones, pero no es trivial que funcione ...
Alfabravo
46

Ampliando la respuesta de 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/,//')"
quince_g
fuente
Advertencia: esto crearía el archivo 'index.html *' en el directorio actual.
ryenus
Tenga en cuenta que la versión corta debe usar www.google.com ya que google.com está redirigiendo a ella a través de 301 ahora con la fecha "pegada"
Hansi
Cuando hice el comentario, la respuesta para ese comando regresó un día cuatro días desactualizado.
Hansi
@ryenus Esta es una gran respuesta. Funciona perfectamente bien. Sin embargo, tengo un problema cuando pongo este comando en un trabajo crontab. La parte de fecha y hora se hace 00:00:00 cada vez que se ejecuta este trabajo. Traté de ejecutar en un script de shell. Mismo resultado.
huzeyfe
@huzeyfe, ¿podría verificar si pasar proxy a curl funciona?
ryenus
21

Un trazador de líneas

Suponiendo que la variable de entorno yahttp_proxy esté establecida :

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

podemos verificar primero la fecha / hora recuperada:

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

Notas

Por si acaso, ciertas opciones podrían ser necesarias para curl:

  • curl -x $proxy

    para configurar explícitamente el servidor proxy para usar, cuando la http_proxyvariable de entorno no está configurada, predeterminada para protocolo httpy puerto 1080 ( manual ).

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

    para deshabilitar explícitamente el almacenamiento en caché , especialmente cuando se usa en un trabajo cron y / o detrás de un servidor proxy.

Forma alternativa probada con RHEL 6 que usa la opción '-u' hasta la fecha en lugar de agregar la "Z" a la salida:

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

Por cierto, google.comes preferible a www.google.com, porque el primero da como resultado una 301respuesta de redireccionamiento, que es mucho más pequeña ( 569vs 20k+caracteres) pero aún así es buena para usar.

ryenus
fuente
sudo date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"
ryenus
^ arriba es la wgetversión, aunque personalmente prefiero usar curl.
ryenus
2
¿Pasar datos no saneados de internet como una variable a una invocación de sudo? ¿Es 1999?
dfc
2
O simplemente use tlsdate y no confíe en errores desagradables como este.
dfc
Sí, funciona con proxies. También leí la pregunta.
dfc
5

Si es puramente un proxy HTTP, está utilizando el puerto 80, por lo que la respuesta básica es no específicamente a eso. NTP usa el puerto UDP 123. Si es un servidor proxy más genérico, que sirve a todos los puertos, entonces tal vez.

Hay algunos programas que hacen NTP sobre HTTP. No uso Linux, pero este podría hacerlo:

http://www.rkeene.org/oss/htp/ (todavía no estoy seguro si esto hará autenticación tampoco).

No pude encontrar uno para Windows, pero volveré a publicar si lo hago.

KCotreau
fuente
Nuevamente para Linux, así que no puedo agregar mucho más que un enlace: mina86.com/2010/01/16/ntp-over-http También podría haber algo que uno de estos publique: nist.gov/pml/div688/grp40/ softwarelist.cfm
KCotreau
El enlace NTP sobre HTTP es inspirador, ¡gracias por eso!
Ton van den Heuvel
5

Una solución rápida y sucia para las personas detrás de un servidor proxy http:

Mi ubicación es GMT + 4, puedo consultar la hora actual desde el servidor timeapi con la url http://www.timeapi.org/utc/in+four+hours , para obtener más información, consulte el sitio web de su ubicación.

Para configurar la fecha y hora que hago:

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

Puede repetir el comando si el comando 'time' inicial informa un valor alto ...

Mehdi Amiri
fuente
Gracias por el consejo, lo tengo aún más fácil: sudo date -s "$(curl -s http://www.timeapi.org/utc/now)"no necesita prestar atención a la zona horaria si su sistema operativo está configurado correctamente. Linux reconoce la zona horaria proporcionada en la cadena y establece la hora del sistema de manera adecuada.
Melebius
2

El servicio NTP está utilizando el protocolo UDP para sincronizar la hora. Por lo tanto, el proxy HTTP / TCP puede no funcionar para él. Alternativa a la respuesta aceptada, hay una buena herramienta htpdate para sincronizar el tiempo detrás del proxy.

Un ejemplo de trabajo cron:

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

Aunque se ha mencionado ntp sobre http, me sorprende que nadie haya mencionado la ingeniosa y pequeña utilidad htpdatedisponible en http://www.vervest.org/htp/ . A diferencia de las alternativas, htpdateforma parte de los repositorios predeterminados de Debian y Ubuntu y se puede instalar usando apt-get.

Se puede ejecutar tanto como un comando ordinario o silenciosamente en modo demonio.

no determinista
fuente
Mira mi respuesta arriba.
Artererpi
1

Suponiendo que http_proxyse establezca la variable de entorno:

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

O usar curl -I --proxy="..." "http://www.google.com/"

Después de todo, si el sitio de Google no tiene su horario establecido, no hay esperanza.

carveone
fuente
1

Expandiendo en https://superuser.com/a/509620/362156

Supongamos que estás en Berlín (Alemania).

Entonces usa esto:

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
fuente
Debe explicar qué es diferente en su solución en comparación con la respuesta de fiford_g.
pabouk