Как использовать ntpdate за прокси?
Можно ли использовать ntpdate за HTTP-прокси с аутентификацией? Если это невозможно, есть ли хорошие альтернативы?
11 ответов
Это похоже на очевидный случай для 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.
Расширяя ответ от 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 -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+
символы), но все же хорошо использовать.
Служба NTP использует протокол UDP для синхронизации времени. Так что HTTP/TCP прокси может не работать для него. Альтернатива принятому ответу, есть хороший инструмент htpdate для синхронизации времени за прокси.
Пример работы cron:
* 3 * * * /usr/bin/htpdate -s -P <PROXY_HOST>:<PROXY__PORT> www.linux.org www.freebsd.org
Если это чисто 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' сообщает о высоком значении...
Хотя ntp over 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 нет установленного времени, надежды нет.
Расширение на /questions/44205/kak-ispolzovat-ntpdate-za-proksi/44225#44225
Предположим, вы в Берлине (Германия).
Тогда используйте это:
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.
Я делаю это на raspi, который находится в частной локальной сети без доступа к сети, без настоящего прокси, но там, где у меня есть другое надежное подключение к Интернету в корпоративной сети, к которому я могу, по крайней мере, подключиться по ssh из raspi.
Есть три шага «настройки», а затем еще пара, чтобы установить время:
У меня есть raspi, позволяющий временно получить доступ к Интернету (я использовал личную точку доступа на своем телефоне)
- находясь онлайн:
sudo apt install proxychains
- после завершения этого процесса вы можете снова отключить его и снова подключить к изолированной сети.
- находясь онлайн:
echo 'socks5 127.0.0.1 17471' | sudo tee -a /etc/proxychains.conf
Сделайте себе удобный скрипт для ssh-подключения:
cat << EOF > startproxy.sh
#!/bin/bash
F=~/.ssh/ssh_socket_for_proxyhains
if [ -f $F ]; then
killall ssh
rm $F
fi
ssh -f -NT -M -S ~/.ssh/ssh_socket_for_proxychains -D 17471 user@server
EOF
chmod +x startproxy.sh
- если ты изменишься
17471
, измените его в обоих местах. - необходимо сделать вышеперечисленное только один раз, остальные шаги можно повторить
Начни это:
./startproxy.sh
.- Должно показаться, что он тихо умер. Но теперь ssh должен появиться в
ps x
или так.
- Должно показаться, что он тихо умер. Но теперь ssh должен появиться в
проверьте, работают ли проксичейны, например:
sudo proxychains apt update
(да, вы тоже можете обновлять и устанавливать подобные вещи).
Затем проверьте, можете ли вы получить чистую дату UTC с помощью:
sudo proxychains 2>/dev/null curl -H'Cache-Control:no-cache' -sI google.com | grep '^Date:' | cut -d' ' -f3 -6 | tail -n 1
Предполагая, что это выдает что-то разумное, установите дату с помощью:
sudo date -s "$(sudo proxychains 2>/dev/null curl -H'Cache-Control:no-cache' -sI google.com | grep '^Date:' | cut -d' ' -f3-6 | tail -n 1 )Z"
Обратите внимание на дополнительные
Z
в конце: В противном случае ваша дата, вероятно, будет установлена неправильно, поскольку это говоритdate -s
что это время UTC, в противном случае он будет считать, что это местное время.Вероятно, вам следует завершить этот ssh-процесс, когда вы закончите, каждый раз, когда вы его используете.
Вам не нужно
server
быть запущенным прокси - просто иметь возможность достучаться по ssh и самому иметь доступ в интернет.Все вышеперечисленное можно сделать подключившись к распи по ssh откуда-то еще, разницы нет. Возможно, вы даже подключились к серверу по ssh, а оттуда к raspi.