É possível usar o ntpdate atrás de um proxy HTTP com autenticação? Caso isso não seja possível, existem boas alternativas?
É possível usar o ntpdate atrás de um proxy HTTP com autenticação? Caso isso não seja possível, existem boas alternativas?
Respostas:
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.
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/,//')"
Supondo que a variável de ambiente já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)"
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_proxy
variável de ambiente não estiver configurada, o padrão é o protocolo http
e 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 301
resposta de redirecionamento, que é muito menor ( caracteres 569
vs 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"
wget
versão, embora eu pessoalmente prefira usar curl
.
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.
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 ...
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.
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
Embora o ntp sobre http tenha sido mencionado, estou surpreso que ninguém tenha mencionado o utilitário bacana htpdate
disponível em http://www.vervest.org/htp/ . Diferente das alternativas, htpdate
faz 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.
Supondo que a http_proxy
variá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.
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/,//')")"
Para uma implementação pré-preparada da excelente resposta do @ryenus, verifique set_system_clock_from_google.sh .