44

Можно ли использовать ntpdate за HTTP-прокси с аутентификацией? Если это невозможно, есть ли хорошие альтернативы?

10 ответов10

43

Расширяя ответ от 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/,//')"
26

Это похоже на очевидный случай для 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.

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

19

Один лайнер

Предполагая, что переменная окружения 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+ символов), но все еще хорош для использования.

5

Быстрое и грязное решение для людей, использующих прокси-сервер 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' сообщает о высоком значении ...

5

Если это чисто HTTP-прокси, он использует порт 80, поэтому основной ответ - нет. NTP использует UDP-порт 123. Если это более общий прокси-сервер, обслуживающий все порты, то возможно.

Есть некоторые программы, которые делают NTP через HTTP. Я не использую Linux, но этот может сделать это:

http://www.rkeene.org/oss/htp/ (все еще не уверен, будет ли это делать аутентификацию либо).

Я не мог найти один для Windows, но я отправлю обратно, если я сделаю.

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

Хотя было упомянуто ntp over http, я удивлен тем, что никто не упомянул об изящной маленькой утилите htpdate доступной на http://www.vervest.org/htp/. В отличие от альтернатив, htpdate является частью стандартных репозиториев Debian и Ubuntu и может быть установлен с помощью apt-get .

Его можно запускать как обычной командой, так и без вывода сообщений в режиме демона.

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

Служба NTP использует протокол UDP для синхронизации времени. Так что HTTP/TCP прокси может не работать для него. Альтернативой принятому ответу является хороший инструмент htpdate для синхронизации времени за прокси.

Пример работы cron:

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

Для полностью работающей предварительно запеченной реализации превосходного ответа @ryenus , проверьте set_system_clock_from_google.sh.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .