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?

Ton van den Heuvel
fonte
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

dfc
fonte
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/,//')"
fiford_g
fonte
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.

ryenus
fonte
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.

KCotreau
fonte
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 ...

Mehdi Amiri
fonte
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
artificerpi
fonte
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.

não determinístico
fonte
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.

carveone
fonte
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/,//')")"
PeterZ
fonte
Você deve explicar o que é diferente na sua solução em comparação com a resposta do fiford_g.
precisa saber é
0

Para uma implementação pré-preparada da excelente resposta do @ryenus, verifique set_system_clock_from_google.sh .

Jay Taylor
fonte