Чи можливо використовувати ntpdate за HTTP-проксі з аутентифікацією? Якщо це неможливо, чи є хороші альтернативи?
Чи можливо використовувати ntpdate за HTTP-проксі з аутентифікацією? Якщо це неможливо, чи є хороші альтернативи?
Відповіді:
Це здається очевидним випадком для 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.
Я не думаю, що я ніколи не бачив такої кількості рекомендацій використовувати несанізовані дані з Інтернету як аргумент до судового виклику.
Розгортання відповіді від 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/,//')"
Припускаючи , що змінна оточення 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"
wget
версія, хоча я особисто вважаю за краще використовувати curl
.
Якщо це суто HTTP-проксі, він використовує порт 80, тому основна відповідь - це не конкретно. NTP використовує порт UDP 123. Якщо це більш загальний проксі-сервер, який обслуговує всі порти, то, можливо.
Є деякі програми, які роблять NTP через HTTP. Я не використовую Linux, але це може зробити це:
http://www.rkeene.org/oss/htp/ (досі не впевнений, чи не вдасться це зробити і для автентифікації).
Я не зміг знайти його для Windows, але я відправлю повідомлення, якщо це зробити.
Швидке та брудне рішення для людей, що стоять за проксі-сервером 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 розпізнає часовий пояс, наданий у рядку, та встановлює системний час відповідним чином.
Служба NTP використовує протокол UDP для синхронізації часу. Тому проксі-сервер HTTP / TCP може не працювати для цього. Альтернативою прийнятій відповіді є хороший інструмент htpdate для синхронізації часу за проксі.
Приклад роботи з хроном:
* 3 * * * /usr/bin/htpdate -s -P <PROXY_HOST>:<PROXY__PORT> www.linux.org www.freebsd.org
Хоча ntp через 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 не встановлено часу, сподівання немає.
Розгортається на 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/,//')")"
Для повноцінної роботи заздалегідь реалізованої відмінної відповіді @ryenus перегляньте set_system_clock_from_google.sh .