2019-02-18

NTPが使えない場合に時間合わせをする小技

もしNTPが使えない環境で,正しい時刻に合わせたい場合はどうすればいいのでしょうか.

答えは簡単です.HTTP Response Headerにある date を利用します.

1
2
3
4
5
6
7
8
# Check the time
$ date && (curl -fs --head https://google.com | grep ^date: | sed 's/date: //g' || true)
Mon Feb 18 19:03:43 JST 2019
Mon, 18 Feb 2019 10:03:43 GMT

# Synchronize time
$ date -s "$(curl -fs --head https://google.com | grep ^date: | sed 's/date: //g' || true)"
Mon, 18 Feb 2019 10:03:43 GMT

何をやっているかというと,https://google.comの header を取得し,date から不要な部分を sed で取り除き,それを date -s の引数として与えてあげることで時間合わせが可能になります.

別にGoogleでなくても可能ですが,Rustなどの多くのOSSではGoogleが使われるようです.たまたま rust-lang/rust.travis.yml を眺めていたら見つけたので共有しておきます.

ref: https://github.com/rust-lang/rust/blob/master/.travis.yml#L261-L268