Расширяя ответ от 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 '' | sed 's/,//')"
Можно ли использовать ntpdate за HTTP-прокси с аутентификацией? Если это невозможно, есть ли хорошие альтернативы?
Расширяя ответ от 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 '' | sed 's/,//')"
This seems like a clear case for 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.
I do not think i have ever seen so many recommendations to use unsanitized data from internet as an argument to a sudo invocation.
Предполагая, что переменная окружения http_proxy
будет уже установлено :
sudo date -s "$(curl -sD - google.com | grep '^Date:' | cut -d' ' -f3-6)Z"
Чтобы быть уверенным в том, что передается sudo date -s
, просто запустите curl ...
часть команды, чтобы увидеть ее вывод:
curl -sD - google.com | grep '^Date:' | cut -d' ' -f3-6
Или более безопасная версия, которая проверяет длину вывода curl
:
date_utc=$(curl -sD - google.com | grep '^Date:' | cut -d' ' -f3-6) [ -n "$date_utc" ] && sudo date -s "$Z"
На всякий случай могут потребоваться определенные опции для 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+
символами), но все еще хорош для использования.
Если это чисто HTTP-прокси, он использует порт 80, поэтому основной ответ - нет. NTP использует UDP-порт 123. Если это более общий прокси-сервер, обслуживающий все порты, то, возможно,.
Есть некоторые программы, которые делают NTP через HTTP. Я не использую Linux, но этот может сделать это:
http://www.rkeene.org/oss/htp/ (все еще не уверен, будет ли это делать аутентификацию либо).
Я не мог найти один для Windows, но я отправлю обратно, если я сделаю.
A quick and dirty solution for people behind a http proxy server:
My location is GMT+4, I can check out the current time from timeapi server with url http://www.timeapi.org/utc/in+four+hours, for more info pls checkout the website for your location.
To setup date & time I do:
time sudo date $(wget -O - "http://www.timeapi.org/utc/in+four+hours" 2>/dev/null | sed s/[-T:+]/\ /g | awk '' | tr -d " " )
You can repeat the command if the initial 'time' command reports a high value...
Предполагая, что 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 нет установленного времени, надежды нет.
Расширение на 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 '' | sed 's/,//')")"
Служба NTP использует протокол UDP для синхронизации времени. Так что HTTP / TCP прокси может не работать для него. Альтернативой принятому ответу является хороший инструмент htpdate для синхронизации времени за прокси.
Пример работы cron:
* 3 * * * /usr/bin/htpdate -s -P <PROXY_HOST>:<PROXY__PORT> www.linux.org www.freebsd.org
Для полностью работающей предварительно запеченной реализации превосходного ответа @ryenus, проверьте set_system_clock_from_google.sh .