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

56007
Ton van den Heuvel

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

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

9 ответов на вопрос

43
fiford_g

Расширяя ответ от 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/,//')" 
Предостережение: это создаст файл 'index.html *' в текущем каталоге. ryenus 10 лет назад 0
Обратите внимание, что в короткой версии следует использовать www.google.com, поскольку google.com перенаправляет на нее через 301 с датой «зависания». Hansi 10 лет назад 0
Когда я сделал комментарий, ответ на эту команду возвратился на четыре дня позже. Hansi 9 лет назад 0
@ryenus Это отличный ответ. Работает отлично. Однако у меня есть проблема, когда я помещаю эту команду в задание crontab. Часть времени даты сделана 00:00:00 всякий раз, когда выполняется это задание. Я пытался запустить в сценарии оболочки. Тот же результат. huzeyfe 9 лет назад 0
@huzeyfe, не могли бы вы проверить, работает ли [передача прокси в curl] (http://superuser.com/questions/307158/how-to-use-ntpdate-behind-a-proxy/807326#807326)? ryenus 9 лет назад 0
25
dfc

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.

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

Этот ответ действительно должен быть наверху. Pi Delport 8 лет назад 1
Мне не удалось заставить его работать - с каждой комбинацией он выдает ошибки о ложных тикерах. Ответ Wget ниже работает. Hi-Angel 7 лет назад 0
Работал на машине Centos6.9, но не радость. Это кажется более здоровым, чем другие рекомендации, но это не тривиально, чтобы заставить его работать ... Alfabravo 5 лет назад 0
18
ryenus

Один лайнер

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

`sudo date -s" $ (wget -qSO- --max-redirect = 0 google.com 2> & 1 | grep Date: | cut -d '' -f5-8) Z "` ryenus 9 лет назад 0
^ выше - версия `wget`, хотя я лично предпочитаю использовать` curl`. ryenus 9 лет назад 0
Передача неанизированных данных из Интернета в качестве переменной для вызова sudo? Это 1999? dfc 9 лет назад 2
Или просто используйте tlsdate и не полагайтесь на такие неприятные ошибки. dfc 9 лет назад 2
да, это работает с прокси. Я тоже прочитал вопрос. dfc 9 лет назад 0
zsh не нравится шаблон grep без кавычек; это приводит к ошибке `(23) Failed write body`. Поэтому при использовании zsh используйте `sudo date -s" $ (curl -sD - google.com | grep '^ Date:' | cut -d '' -f3-6) Z "`. Вероятно, есть модификатор конфигурации ZSH, который изменяет это поведение, но я не знаю, что это такое. Кроме того, поскольку мы говорим об использовании прокси, `google.com`, похоже, кэшируется некоторыми прокси (перенаправление 301), а` www.google.com`, будучи живой страницей, каждый раз перезагружается ( и поэтому его метка времени точна). Ville 9 лет назад 0
Полностью работающую предварительно запеченную реализацию см. В [set_system_clock_from_google.sh] (https://gist.github.com/jaytaylor/60c8a4e22431c4271200cab68186deb7). Jay Taylor 5 лет назад 0
5
KCotreau

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

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

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

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

Опять же для Linux, поэтому я не могу добавить ничего, кроме ссылки: http://mina86.com/2010/01/16/ntp-over-http/ Может также быть что-то, что один из них публикует: http: // www .nist.gov / PML / div688 / grp40 / softwarelist.cfm KCotreau 12 лет назад 0
Ссылка NTP через HTTP вдохновляет, спасибо за это! Ton van den Heuvel 12 лет назад 0
5
Mehdi Amiri

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...

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

Предполагая, что 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
PeterZ

Расширение на 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/,//')")" 
Вы должны объяснить, что отличается в вашем решении по сравнению с ответом fiford_g. pabouk 9 лет назад 0
1
artificerpi

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

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

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

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