Как получить date&time с помощью вихревой команды?

В моем ПК не работает RTC, Таким образом, я хочу Date&Time от использования сервера curl управляйте или есть ли любые возможности получить дату и время без RTC в ПК. Требуемый формат для date&time DDMMYYYYHHMMSS.

-1
задан 13 July 2017 в 15:50

5 ответов

Во-первых, curl делает http (s) запросами. Предположение, что у Вас есть веб-сервер, слушающий на машине, таким образом, у Вас есть 2 опции:

  1. Создают сценарий (php/asp/node), который дает Вам дату и время как ответ на запрос.

  2. Получают время из заголовков ответа сервера.

    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"
3
ответ дан 29 September 2019 в 11:02

Получите дату из заголовка ответа HTTP. Удалите помеху. Назначьте дату.

$ date -s `curl -I 'https://google.com/' 2>/dev/null | grep -i '^date:' | sed 's/^[Dd]ate: //g'`

Hope это помогает.

0
ответ дан 29 September 2019 в 11:02

Если необходимо получить время от удаленного сервера, используйте сервер 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, как получено из этого, ТАК отправьте) от целой части, и печатает обоих части в десятичном числе.

1
ответ дан 29 September 2019 в 11:02

использовать метку времени в заголовке ответа 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")"
0
ответ дан 5 February 2020 в 16:31

Вот как я это делаю. У меня есть оператор 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
1
ответ дан 5 November 2020 в 16:34

Другие вопросы по тегам:

Похожие вопросы: