Como usar o ntpdate atrás de um proxy?


49

É possível usar o ntpdate atrás de um proxy HTTP com autenticação? Caso isso não seja possível, existem boas alternativas?


Qual sistema operacional, por favor?
KCotreau

Linux no meu caso (não acho que isso importe muito).
Ton van den Heuvel

Isso só importava porque era mais difícil encontrar algo remotamente para o Windows. A principal pesquisa que usei foi "NTP over HTTP", caso você queira pesquisar mais.
KCotreau

3
Se você está atrás de um proxy HTTP, provavelmente significa que você está em uma empresa, e essa empresa pode fornecer seus próprios serviços NTP.
Tristan

Respostas:


29

Este parece ser um 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.

Eu acho que nunca vi tantas recomendações para usar dados não autorizados da internet como argumento para uma invocação de sudo.

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


1
Esta resposta realmente deve estar no topo.
Delport Pi

Não consegui fazê-lo funcionar - com cada combinação ele imprime erros sobre falsos tickers. wget resposta abaixo funciona.
28816 Oi-Angel

Tenho trabalhado em uma máquina Centos6.9, mas sem alegria. Este parece mais saudável do que outras recomendações, mas não é trivial para fazê-lo funcionar ...
Alfabravo

46

Expandindo a resposta por 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/,//')"

Advertência, isso criaria o arquivo 'index.html *' no diretório atual.
Ryenus

Note-se que a versão curta deve usar www.google.com desde google.com está redirecionando a ele através de 301 agora com a data "preso"
Hansi

Quando fiz o comentário, a resposta para esse comando retornou um dia quatro dias desatualizado.
Hansi

@ryenus Esta é uma ótima resposta. Funciona perfeitamente bem. No entanto, tenho um problema quando coloco esse comando em um trabalho crontab. A parte da hora da data é feita 00:00:00 sempre que esse trabalho é executado. Eu tentei executar em um script de shell. Mesmo resultado.
huzeyfe

@huzeyfe, por favor, verifique se a passagem de proxy para curl funciona?
Ryenus

21

One Liner

Supondo que a variável de ambiente http_proxy esteja configurada :

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

podemos verificar a data / hora recuperada primeiro:

# 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

Apenas no caso, podem ser necessárias certas opções para curl:

  • curl -x $proxy

    para definir explicitamente o servidor proxy para uso, quando a http_proxyvariável de ambiente não estiver configurada, o padrão é o protocolo httpe a porta 1080 ( manual ).

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

    desabilitar explicitamente o armazenamento em cache , especialmente quando usado em um trabalho cron e / ou atrás de um servidor proxy.

Formulário alternativo testado com RHEL 6 que usa a opção '-u' até o momento em vez de anexar o "Z" à saída:

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

BTW, google.comé o preferido www.google.com, porque o primeiro resulta em uma 301resposta de redirecionamento, que é muito menor ( caracteres 569vs 20k+), mas ainda é boa de usar.


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

^ acima é a wgetversão, embora eu pessoalmente prefira usar curl.
Ryenus

2
Passando dados não autorizados da Internet como uma variável para uma chamada de sudo? É 1999?
dfc

2
Ou apenas use tlsdate e não confie em kludges desagradáveis ​​como este.
dfc

sim, funciona com proxies. Eu também li a pergunta.
dfc

5

Se é puramente um proxy HTTP, está usando a porta 80, portanto a resposta básica é não especificamente àquela. O NTP usa a porta UDP 123. Se for um servidor proxy mais genérico, servindo todas as portas, talvez seja.

Existem alguns programas por aí que fazem NTP sobre HTTP. Eu não uso Linux, mas este pode fazê-lo:

http://www.rkeene.org/oss/htp/ (ainda não tenho certeza se isso fará autenticação).

Não consegui encontrar um para o Windows, mas postarei de volta se o fizer.


Novamente no Linux, não posso acrescentar nada além de um link: mina86.com/2010/01/16/ntp-over-http Também pode haver algo que um deles publica: nist.gov/pml/div688/grp40/ softwarelist.cfm
KCotreau

O link NTP sobre HTTP é inspirador, obrigado por isso!
Ton van den Heuvel

5

Uma solução rápida e suja para as pessoas por trás de um servidor proxy http:

Minha localização é GMT + 4, posso verificar a hora atual no servidor timeapi com o URL http://www.timeapi.org/utc/in+four+hours , para mais informações , consulte o site da sua localização.

Para configurar a data e hora, eu faço:

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

Você pode repetir o comando se o comando inicial 'time' reportar um valor alto ...


Obrigado pela dica, fiquei ainda mais fácil: sudo date -s "$(curl -s http://www.timeapi.org/utc/now)"você não precisa prestar atenção ao fuso horário se o seu sistema operacional estiver definido corretamente. O Linux reconhece o fuso horário fornecido na cadeia e define a hora do sistema adequadamente.
precisa saber é o seguinte

2

O serviço NTP está usando o protocolo UDP para sincronizar o horário. Portanto, o proxy HTTP / TCP pode não funcionar para ele. Alternativa à resposta aceita, existe uma boa ferramenta htpdate para sincronizar o tempo atrás do proxy.

Um exemplo de trabalho cron:

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

2

Embora o ntp sobre http tenha sido mencionado, estou surpreso que ninguém tenha mencionado o utilitário bacana htpdatedisponível em http://www.vervest.org/htp/ . Diferente das alternativas, htpdatefaz parte dos repositórios padrão do Debian e Ubuntu e pode ser instalado usando apt-get.

Pode ser executado como um comando comum ou silenciosamente no modo daemon.


Verifique minha resposta acima.
artificerpi

1

Supondo que a http_proxyvariável de ambiente esteja configurada:

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

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

Afinal, se o site do Google não tiver seu tempo definido, não há esperança.


1

Expansão em https://superuser.com/a/509620/362156

Vamos supor que você esteja em Berlim (Alemanha).

Então use isto:

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

Você deve explicar o que é diferente na sua solução em comparação com a resposta do fiford_g.
precisa saber é

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.