Як використовувати ntpdate за проксі?


49

Чи можливо використовувати ntpdate за HTTP-проксі з аутентифікацією? Якщо це неможливо, чи є хороші альтернативи?


Яку ОС будь ласка?
KCotreau

Linux у моєму випадку (не думаю, що це має велике значення).
Ton van den Heuvel

Це мало значення лише тому, що важче було знайти що-небудь віддалено для Windows. Ключовий пошук, який я використовував, - "NTP через HTTP", якщо ви хочете шукати далі.
KCotreau

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.

Я не думаю, що я ніколи не бачив такої кількості рекомендацій використовувати несанізовані дані з Інтернету як аргумент до судового виклику.

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


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

Застереження, це створило б файл 'index.html *' у поточному каталозі.
ryenus

Зауважте, що для короткої версії слід використовувати www.google.com, оскільки google.com перенаправляє на неї через 301 зараз із датою "застрягнення"
Хансі

Коли я зробив коментар, відповідь на цю команду повернувся через день із чотирма днями.
Хансі

@ryenus Це чудова відповідь. Це прекрасно працює. Однак у мене є проблема, коли я ставлю цю команду в заданні на crontab. Часова частина дати проводиться 00:00:00, коли ця робота виконується. Я намагався запустити сценарій оболонки. Той самий результат.
huzeyfe

@huzeyfe, перевірте, чи працює передача проксі для згортання ?
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)"

BTW, 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

^ вище wgetверсія, хоча я особисто вважаю за краще використовувати curl.
ryenus

2
Передача несанізованих даних з Інтернету як змінної до виклику sudo? Це 1999 рік?
dfc

2
Або просто використовувати tlsdate і не покладатися на такі неприємні хитрощі.
dfc

так, працює з проксі. Я також читав питання.
dfc

5

Якщо це суто HTTP-проксі, він використовує порт 80, тому основна відповідь - це не конкретно. NTP використовує порт UDP 123. Якщо це більш загальний проксі-сервер, який обслуговує всі порти, то, можливо.

Є деякі програми, які роблять NTP через HTTP. Я не використовую Linux, але це може зробити це:

http://www.rkeene.org/oss/htp/ (досі не впевнений, чи не вдасться це зробити і для автентифікації).

Я не зміг знайти його для Windows, але я відправлю повідомлення, якщо це зробити.


Знову для Linux, тому я не можу додати нічого іншого, крім посилання: mina86.com/2010/01/16/ntp-over-http Можливо, також з’явиться щось, що одна з цих публікацій: nist.gov/pml/div688/grp40/ softwarelist.cfm
KCotreau

NTP через HTTP-посилання надихає, за це дякую!
Ton van den Heuvel

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 для синхронізації часу за проксі.

Приклад роботи з хроном:

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

2

Хоча ntp через 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 не встановлено часу, сподівання немає.


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

Ви повинні пояснити, що відрізняється у вашому рішенні порівняно з відповіддю fiford_g.
pabouk

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.