Как использовать ntpdate за прокси?

49

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

Тон ван ден Хеувел
источник
Какую ОС, пожалуйста?
Котро
Linux в моем случае (не думаю, что это имеет большое значение).
Тон ван ден Хеувел
Это имело значение только потому, что было труднее найти что-нибудь удаленно для Windows. Поиск ключей, который я использовал, был «NTP over HTTP», на случай, если вы захотите продолжить поиск.
Котро
3
Если вы находитесь за HTTP-прокси, это, вероятно, означает, что вы находитесь в компании, и эта компания может предоставлять свои собственные услуги NTP.
Тристан

Ответы:

29

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

DFC
источник
1
Этот ответ действительно должен быть наверху.
Пи Дельпорт
Мне не удалось заставить его работать - с каждой комбинацией он выдает ошибки о ложных тикерах. Ответ Wget ниже работает.
Привет, Ангел,
Работал на машине Centos6.9, но не радость. Это кажется более здоровым, чем другие рекомендации, но это не тривиально, чтобы заставить его работать ...
Alfabravo
46

Расширяя ответ от 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/,//')"
fiford_g
источник
Предостережение: это создаст файл 'index.html *' в текущем каталоге.
ryenus
Обратите внимание, что в короткой версии следует использовать www.google.com, поскольку google.com перенаправляет на нее через 301, а дата «застряла»
Hansi
Когда я сделал комментарий, ответ на эту команду возвратился на четыре дня позже.
Ханси
@ryenus Это отличный ответ. Работает отлично. Однако у меня есть проблема, когда я помещаю эту команду в задание crontab. Часть времени даты сделана 00:00:00 всякий раз, когда выполняется это задание. Я пытался запустить в сценарии оболочки. Тот же результат.
huzeyfe
@huzeyfe, не могли бы вы проверить, работает ли передача прокси на curl ?
ryenus
21

Один лайнер

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

ryenus
источник
sudo date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"
Рен
^ выше wgetверсия, хотя я лично предпочитаю использовать curl.
Рен
2
Передача неанизированных данных из Интернета в качестве переменной для вызова sudo? Это 1999?
декабря
2
Или просто используйте tlsdate и не полагайтесь на неприятные ошибки.
декабря
да, это работает с прокси. Я тоже прочитал вопрос.
декабря
5

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

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

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

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

KCotreau
источник
Опять же для Linux, поэтому я не могу добавить ничего, кроме ссылки: mina86.com/2010/01/16/ntp-over-http Также может быть что-то, что один из них публикует: nist.gov/pml/div688/grp40/ softwarelist.cfm
KCotreau
Ссылка NTP через HTTP вдохновляет, спасибо за это!
Тон ван ден Хеувел
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' сообщает о высоком значении ...

Мехди Амири
источник
Спасибо за совет, мне стало еще проще: sudo date -s "$(curl -s http://www.timeapi.org/utc/now)"вам не нужно обращать внимание на часовой пояс, если ваша ОС установлена ​​правильно. Linux распознает часовой пояс, указанный в строке, и соответствующим образом устанавливает системное время.
Мелебиус
2

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

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

* 3 * * * /usr/bin/htpdate -s -P <PROXY_HOST>:<PROXY__PORT> www.linux.org www.freebsd.org
artificerpi
источник
2

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

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

недетерминирован
источник
Проверьте мой ответ выше.
artificerpi
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 нет установленного времени, надежды нет.

carveone
источник
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/,//')")"
PeterZ
источник
Вы должны объяснить, что отличается в вашем решении по сравнению с ответом fiford_g.
Пабук