如何在代理后面使用ntpdate?


49

是否可以在具有身份验证的HTTP代理后面使用ntpdate?万一不可能,有什么好的选择吗?


请问什么操作系统?
KCotreau

就我而言,Linux(尽管并不重要)。
Ton van den Heuvel

这很重要,因为很难为Windows远程找到任何东西。如果您想进一步搜索,我使用的关键搜索是“基于HTTP的NTP”。
KCotreau

3
如果您使用HTTP代理,则可能意味着您在一家公司中,而该公司可能会提供自己的NTP服务。
特里斯坦,

Answers:


29

这似乎是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.

我认为我从未见过如此多的建议来使用来自Internet的未经消毒的数据作为sudo调用的论据。

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


1
这个答案应该真的是最重要的。
Pi Delport

我没有设法使其正常工作-每组合一次,它都会打印有关错误行情自动收录器的错误。下面的wget答案确实有效。
Hi-Angel

一直在Centos6.9机器上进行测试,但没有任何乐趣。这似乎比其他建议更健康,但要使其正常工作并
非易事

46

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

请注意,这将在当前目录中创建文件“ index.html *”。
ryenus 2014年

请注意,短版应使用www.google.com,因为google.com现在通过301重定向到日期为“ stuck”的日期
Hansi 2014年

当我发表评论时,该命令的响应已过期四天。
汉斯2014年

@ryenus这是一个很好的答案。它工作得很好。但是,当我将此命令放在crontab作业中时遇到问题。每当此作业运行时,日期的时间部分就是00:00:00。我试图在shell脚本中运行。结果相同。
huzeyfe

@huzeyfe,请检查传递给curl的代理是否有效?
ryenus 2014年

21

一线

假设环境变量http_proxy已设置

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

我们可以先验证检索到的日期/时间:

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

笔记

以防万一,可能需要某些选项curl

  • curl -x $proxy

    显式设置要使用的代理服务器,如果http_proxy未设置环境变量,则默认为协议http和端口1080手动)。

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

    明确禁用缓存,尤其是在cron作业中和/或在代理服务器之后使用时。

使用RHEL 6测试过的替代格式,该格式迄今为止使用'-u'选项,而不是在输出后附加“ Z”:

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

BTW google.com优于www.google.com,因为前者会导致301重定向响应,该响应要小得多(相569对于20k+字符),但仍易于使用。


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

上面的^是wget版本,尽管我个人更喜欢使用curl
ryenus

2
将未经消毒的数据从互联网作为变量传递给sudo调用?是1999年吗?
dfc

2
或仅使用tlsdate而不依赖于此类讨厌的消息。
dfc

是的,它可以与代理一起使用。我也读过这个问题。
dfc 2014年

5

如果它纯粹是HTTP代理,则使用端口80,因此基本答案不是。NTP使用UDP端口123。如果它是服务于所有端口的更通用的代理服务器,则可能是。

有一些程序可以通过HTTP执行NTP。我不使用Linux,但是这个可以做到:

http://www.rkeene.org/oss/htp/(仍然不确定是否可以进行身份​​验证)。

我找不到适用于Windows的计算机,但是如果这样做,我会回发。


再次针对Linux,因此我只能添加链接以外的其他内容:mina86.com/2010/01/16/ntp-over-http这些内容之一可能还会发布:nist.gov/pml/div688/grp40/ softwarelist.cfm
KCotreau

通过HTTP链接的NTP令人振奋,谢谢!
Ton van den Heuvel,

5

一个针对HTTP代理服务器背后人员的快速而肮脏的解决方案:

我的位置是格林尼治标准时间+4,我可以使用网址http://www.timeapi.org/utc/in+four+hours从timeapi服务器中查询当前时间,有关更多信息,请查看您所处位置的网站。

要设置日期和时间,我要做的是:

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

如果初始“时间”命令报告较高值,则可以重复此命令。


感谢您的提示,我变得更加容易:sudo date -s "$(curl -s http://www.timeapi.org/utc/now)"如果您的操作系统设置正确,则无需关注时区。Linux会识别字符串中提供的时区,并适当地设置系统时间。
Melebius

2

NTP服务正在使用UDP协议同步时间。因此,HTTP / TCP代理可能不适用于它。除了可接受的答案之外,还有一个很好的htpdate工具可以同步代理后的时间。

cron作业示例:

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

2

尽管已经提到了http上的ntp,但令我惊讶的是,没有人提到http://www.vervest.org/htp/htpdate上的漂亮实用程序。与其他选择不同,它是Debian和Ubuntu默认存储库的一部分,可以使用安装。htpdateapt-get

它既可以作为普通命令运行,也可以在守护程序模式下静默运行。


检查我上面的答案。
artificerpi

1

假设http_proxy设置了环境变量:

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

或使用 curl -I --proxy="..." "http://www.google.com/"

毕竟,如果Google的网站没有设置时间,那就没有希望了。


1

https://superuser.com/a/509620/362156上扩展

假设您在柏林(德国)。

然后使用:

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

与fiford_g的答案相比,您应该解释解决方案的不同之处。
pabouk

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.