Можно ли использовать ntpdate за HTTP-прокси с аутентификацией? Если это невозможно, есть ли хорошие альтернативы?
10 ответов
Расширяя ответ от 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/,//')"
Это похоже на очевидный случай для 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.
Один лайнер
Предполагая, что переменная окружения 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 "${date_utc}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:
Мое местоположение - GMT+4, я могу узнать текущее время с сервера timeapi с помощью URL http://www.timeapi.org/utc/in+four+hours, для получения дополнительной информации, пожалуйста, проверьте сайт на предмет вашего местоположения.
Для установки даты и времени я делаю:
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 " " )
Вы можете повторить команду, если начальная команда 'time' сообщает о высоком значении ...
Если это чисто HTTP-прокси, он использует порт 80, поэтому основной ответ - нет. NTP использует UDP-порт 123. Если это более общий прокси-сервер, обслуживающий все порты, то возможно.
Есть некоторые программы, которые делают NTP через HTTP. Я не использую Linux, но этот может сделать это:
http://www.rkeene.org/oss/htp/ (все еще не уверен, будет ли это делать аутентификацию либо).
Я не мог найти один для Windows, но я отправлю обратно, если я сделаю.
Расширение на 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/,//')")"
Хотя было упомянуто ntp over http, я удивлен тем, что никто не упомянул об изящной маленькой утилите htpdate
доступной на http://www.vervest.org/htp/. В отличие от альтернатив, htpdate
является частью стандартных репозиториев Debian и Ubuntu и может быть установлен с помощью apt-get
.
Его можно запускать как обычной командой, так и без вывода сообщений в режиме демона.
Предполагая, что переменная среды 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 нет установленного времени, надежды нет.
Служба 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.