是否可以在经过身份验证的 HTTP 代理后面使用 ntpdate? 如果不可能,有什么好的替代方案吗?
答案1
这似乎是 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.
我认为我从未见过如此多的建议使用来自互联网的未清理数据作为 sudo 调用的参数。
答案2
扩展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/,//')"
答案3
一句话
假设环境变量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)"
顺便说一句,google.com
比 更受欢迎www.google.com
,因为前者会导致301
重定向响应,这要小得多(569
相对于20k+
字符而言)但仍然可以使用。
答案4
如果它纯粹是一个 HTTP 代理,它使用端口 80,因此对此的基本答案是否定的。NTP 使用 UDP 端口 123。如果它是一个更通用的代理服务器,为所有端口提供服务,那么也许可以。
有一些程序可以通过 HTTP 执行 NTP。我不使用 Linux,但这个程序可能可以做到:
http://www.rkeene.org/oss/htp/(仍然不确定这是否可以进行身份验证)。
我找不到适用于 Windows 的版本,但如果找到了,我会回复。