В моем ПК не работает RTC, Таким образом, я хочу Date&Time от использования сервера curl
управляйте или есть ли любые возможности получить дату и время без RTC в ПК. Требуемый формат для date&time DDMMYYYYHHMMSS
.
Во-первых, curl
делает http (s) запросами. Предположение, что у Вас есть веб-сервер, слушающий на машине, таким образом, у Вас есть 2 опции:
Создают сценарий (php/asp/node), который дает Вам дату и время как ответ на запрос.
Получают время из заголовков ответа сервера.
curl -v https://google.com/
это даст Вам среди прочего, строке как это
...
< Date: Wed, 02 Mar 2016 18:39:13 GMT
...
С тем результатом, можно проанализировать и преобразовать к формату, который Вы хотите.
dateFromServer=$(curl -v --silent https://google.com/ 2>&1 \
| grep Date | sed -e 's/< Date: //'); date +"%d%m%Y%H%M%S" -d "$dateFromServer"
необходимо отметить различие GMT по сравнению с местным временем и адаптировать его к потребностям.
Обновление 26.11.2018:
Как @SopalajodeArrierez отмеченный, не возможно выполнить это, когда Сертификаты не обновляются, или время является путем от правильного значения, таким образом, эти --insecure
опции необходимы на вихревой команде.
dateFromServer=$(curl -v --insecure --silent https://google.com/ 2>&1 \
| grep Date | sed -e 's/< Date: //'); date +"%d%m%Y%H%M%S" -d "$dateFromServer"
Получите дату из заголовка ответа HTTP. Удалите помеху. Назначьте дату.
$ date -s `curl -I 'https://google.com/' 2>/dev/null | grep -i '^date:' | sed 's/^[Dd]ate: //g'`
Hope это помогает.
Если необходимо получить время от удаленного сервера, используйте сервер NTP.
Например:
$ ntpq -c 'rv 0 clock' localhost
clock=da8b6fe7.ae195287 Thu, Mar 10 2016 9:30:39.680
clock
значение является меткой времени NTP в шестнадцатеричном числе (эпоха, будучи 01.01.1900). Можно обработать его немного для получения метки времени Unix, с которой можно затем использовать date
:
$ ntpq -c raw -c 'rv 0 clock' localhost
Output set to raw
clock=0xda8b775d.ee94c630
$ ntpq -c raw -c 'rv 0 clock' localhost | gawk -F '[ =.]' --non-decimal-data 'NR==2{printf "@%d.%d\n", $2 - 2209075200, "0x"$3}'
@1457497973.4177870717
$ ntpq -c raw -c 'rv 0 clock' localhost | gawk -F '[=.]' --non-decimal-data 'NR==2{printf "@%d.%d\n", $2 - 2209075200, "0x"$3}' | xargs date +'%d%m%Y%H%M%S' -d
09032016100323
В моем случае у меня есть демон NTP, работающий локально, из которого я мог запросить, следовательно использование localhost
. Вы могли использовать, вместо этого, один из многих общедоступных серверов NTP, такой как ntp.ubuntu.com
.
awk
управляйте читает строку, разделяет его на =
и .
, так, чтобы эти три поля были clock
, целая часть метки времени и дробной части. Затем это вычитает 2209075200 (различие в секундах между Unix и эпохи NTP, как получено из этого, ТАК отправьте) от целой части, и печатает обоих части в десятичном числе.
использовать метку времени в заголовке ответа htttp.
date -d "$(curl -sI baidu.com| grep -i '^date:'|cut -d' ' -f2-)"
date -d "$(curl -sI baidu.com| grep -i '^date:'|cut -d' ' -f2-)" | xargs -I {} date --date='{}' "+%Y-%m-%d %H:%M:%S"
# below cmd is set new date
date -s "$(date -d "$(curl -sI baidu.com| grep -i '^date:'|cut -d' ' -f2-)" | xargs -I {} date --date='{}' "+%Y-%m-%d %H:%M:%S")"
Вот как я это делаю. У меня есть оператор switch для перевода трехсимвольного представления месяца, возвращаемого сервером, в цифровое значение месяца. Это должно работать во многих стандартных средах Unix, если установлены curl, echo, cut, date и bash.
#!/bin/bash
# Automatically Updates System Time According to the NIST Atomic Clock in a Linux Environment
nistTime=$(curl -I --insecure 'https://nist.time.gov/' | grep "Date")
echo $nistTime
dateString=$(echo $nistTime | cut -d' ' -f2-7)
dayString=$(echo $nistTime | cut -d' ' -f2-2)
dateValue=$(echo $nistTime | cut -d' ' -f3-3)
monthValue=$(echo $nistTime | cut -d' ' -f4-4)
yearValue=$(echo $nistTime | cut -d' ' -f5-5)
timeValue=$(echo $nistTime | cut -d' ' -f6-6)
timeZoneValue=$(echo $nistTime | cut -d' ' -f7-7)
#echo $dateString
case $monthValue in
"Jan")
monthValue="01"
;;
"Feb")
monthValue="02"
;;
"Mar")
monthValue="03"
;;
"Apr")
monthValue="04"
;;
"May")
monthValue="05"
;;
"Jun")
monthValue="06"
;;
"Jul")
monthValue="07"
;;
"Aug")
monthValue="08"
;;
"Sep")
monthValue="09"
;;
"Oct")
monthValue="10"
;;
"Nov")
monthValue="11"
;;
"Dec")
monthValue="12"
;;
*)
continue
esac
date --utc --set $yearValue.$monthValue.$dateValue-$timeValue