是否可以在具有身份验证的HTTP代理后面使用ntpdate?万一不可能,有什么好的选择吗?
是否可以在具有身份验证的HTTP代理后面使用ntpdate?万一不可能,有什么好的选择吗?
Answers:
这似乎是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
通过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/,//')"
假设环境变量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"
wget
版本,尽管我个人更喜欢使用curl
。
如果它纯粹是HTTP代理,则使用端口80,因此基本答案不是。NTP使用UDP端口123。如果它是服务于所有端口的更通用的代理服务器,则可能是。
有一些程序可以通过HTTP执行NTP。我不使用Linux,但是这个可以做到:
http://www.rkeene.org/oss/htp/(仍然不确定是否可以进行身份验证)。
我找不到适用于Windows的计算机,但是如果这样做,我会回发。
一个针对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会识别字符串中提供的时区,并适当地设置系统时间。
尽管已经提到了http上的ntp,但令我惊讶的是,没有人提到http://www.vervest.org/htp/htpdate
上的漂亮实用程序。与其他选择不同,它是Debian和Ubuntu默认存储库的一部分,可以使用安装。htpdate
apt-get
它既可以作为普通命令运行,也可以在守护程序模式下静默运行。
在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/,//')")"
有关@ryenus出色答案的完整工作的预烘焙实现,请查看set_system_clock_from_google.sh。