Como usar o ntpdate por trás de um proxy?

44

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

    
por Ton van den Heuvel 06.07.2011 / 17:54

10 respostas

26

Isso parece um caso claro para o 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 não acho que eu já tenha visto tantas recomendações para usar dados não-analizados da Internet como um argumento para uma invocação de sudo.

Github: link

    
por 29.09.2014 / 10:22
43

Expandindo a resposta 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/,//')"
    
por 23.11.2012 / 14:03
19

One Liner

Supondo que a variável de ambiente http_proxy já está definida :

sudo date -s "$(curl -sD - google.com | grep '^Date:' | cut -d' ' -f3-6)Z"

Para garantir que o que está sendo passado para sudo date -s , basta executar a parte curl ... do comando para ver sua saída:

curl -sD - google.com | grep '^Date:' | cut -d' ' -f3-6

Ou uma versão mais segura que verifique o comprimento de saída de curl :

date_utc=$(curl -sD - google.com | grep '^Date:' | cut -d' ' -f3-6)

[ -n "$date_utc" ] && sudo date -s "${date_utc}Z"

Notas

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

  • curl -x $proxy

    para definir explicitamente o servidor proxy a ser usado, necessário se http_proxy não estiver definido, padrão para o protocolo http e porta 1080 ( manual ).

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

    para explicitamente desativar o armazenamento em cache , especialmente quando usado em uma tarefa cron e / ou atrás de um servidor proxy.

Formulário alternativo testado com o RHEL 6 que usa a opção '-u' para a data 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 é preferível a www.google.com , porque o primeiro resulta em uma resposta de redirecionamento 301 , que é muito menor ( 569 vs 20k+ caracteres), mas ainda é bom de usar.

    
por 04.09.2014 / 18:12
5

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

Existem alguns programas que fazem NTP sobre HTTP. Eu não uso o Linux, mas este pode ser:

link (ainda não tenho certeza se isso fará autenticação também).

Eu não consegui encontrar um para o Windows, mas vou postar de volta se o fizer.

    
por 06.07.2011 / 18:07
5

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

A minha localização é GMT + 4, posso verificar a hora actual a partir do servidor timeapi com a URL link , para mais informações pls confira o site para a sua localização.

Para configurar a data & hora que 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 ...

    
por 06.11.2013 / 09:32
2

Embora o ntp over http tenha sido mencionado, surpreende-me que ninguém tenha mencionado o pequeno utilitário htpdate como disponível no link . Ao contrário das alternativas, htpdate é parte dos repositórios padrão do Debian e do Ubuntu e pode ser instalado usando apt-get .

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

    
por 01.03.2019 / 14:30
2

O serviço NTP está usando o protocolo UDP para sincronizar a hora. Então, o proxy HTTP / TCP pode não funcionar para isso. 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
    
por 17.10.2017 / 05:00
1

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

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.

    
por 24.08.2012 / 15:18
1

Expandindo o link

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

Então use isso:

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/,//')")"
    
por 27.08.2014 / 15:35
0

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

    
por 30.08.2018 / 20:48