Linux

ntpを使わずに時刻を合わせるワンライナー(Proxy環境下でも安心)

More than 1 year has passed since last update.


あなたのlinux、もしくはmac、なんだったらbusybox、時間合ってますか?なに、Proxy環境下だからntpがちゃんと動いてくれなくていつの間にか時刻がズレてく日々を送っている?


このポストは

訳あってProxy環境下で作業をせざるを得ないが、ntpをProxy環境下でちゃんと動作させる術を調べるのが面倒な人のための記事です。

※ 後述しますが、Proxy自体は使います。ntpを使わずに時間を合わせられるという内容です。


(2016.08.31更新) 真・下の一行を打ちこめば時間が合います(必要に応じて sudo をつけてね)

date --set @"$(wget -q https://ntp-a1.nict.go.jp/cgi-bin/jst -O - | sed -n 4p | cut -d. -f1)"


簡単に解説

wget -q https://ntp-a1.nict.go.jp/cgi-bin/jst -O -

この部分で、nictさんから時間を取得しています。以下のような内容が返ってきます。

<HTML>

<HEAD><TITLE>JST</TITLE></HEAD>
<BODY>
1472647059.250
</BODY>
</HTML>

BODYに書いてある内容はいわゆるエポック秒というやつで、1970年1月1日から現在までにどんだけ時間が経過しているかを秒で表しているというやつです。

これをやるためにはProxy通す必要があります。export http_proxy=http://[your.proxy.url:port] みたいにすればProxyは通せます。

sed -n 4p

この部分で、4行目を一行だけ抜き出しています。

上記の例の場合だと 1472647059.250 の部分が抜き出せます。

cut -d. -f1

この部分で、「ピリオドで区切った場合の1フィールド目」を抜き出しています。

-d でデリミター指定、-fで何番目のフィールドかを指定、ですね。

これで 1472647059 が抜き出せます。これを、

date --set @[ここに↑で抜き出したエポック秒を入れる]

という形で与えてあげることで、時間合わせを行います。

管理者権限が必要な場合は、ここに sudo が必要です。


いつ使うのか


  • ntpがProxyを越えてくれないよ、でも設定の方法よくわかんないよ、という方(私)が時間を合わせるとき。

  • ちょっと今だけ時間合えばいいから、という今だけ急ぎたいとき。

  • ntpさん、自動で時間合わせするように設定したけど、なかなかやってくれないな、、、まだかなまだかな、となってしまうせっかちな方(私)が瞬時に時間を合わせようとするとき。

  • etc...


なんで時間合わすのか

時間なんてずらしっぱなしでいいじゃん、別に困らないよ、というのであれば、いいのです。それでいいです。

ただ時間があってないと困るケースがあって、それはSSLの通信を行う場合。時間が合ってないと怒られたりします。

Arch Linux ユーザならAURを使うとき(yaourtコマンド等を使うとき)に時間があってないと怒られます。これはGithubのリポジトリを見に行くからです。

Arch Linux でなくても、Githubを使うときに時間があってないとたぶんうまくいかないと思われます。


時間が合うのはわかったとして、毎日やるのか

毎日上記のコマンドを打つのも面倒ですよね!

であれば、cronで毎時実行するようにしてやればいいですよ!

@kumabook 情報提供ありがとうございました!


※ 以下は 2016.08.31 更新前に記載していた内容です。curl が入っていない環境 (← ままある) だと使えない内容であるため、よりデフォルトで入っている可能性が高い気がする wget を使う内容に書き換えたのが ↑ です。

下記はいまのところ一応、残しておきますが、そのうち消す予定です。


下の一行を打ちこめば時間が合います(必要に応じて sudo をつけてね)

date -s "$(curl -s --head http://www.google.co.jp | grep ^Date | cut -b 7-)"


簡単に解説

curl -s --head http://www.google.co.jp

この部分で、www.google.co.jp のヘッダ部分を取得しています。ヘッダ部分に含まれているDateヘッダーを見るのが目的。

これやるのにProxy通す必要あるんだけどね。export http_proxy=http://[your.proxy.url:port] みたいにすればProxyは通せます。

grep ^Date

この部分で、取得したヘッダからDate: で始まる行を抜き出してます。

抜き出すと、Date: Thu, 08 May 2014 13:36:12 GMT こんなふうになってます。

cut -b 7-

この部分で、↑で抜き出したDateで始まる行の7文字目以降を抜き出すってことをしています。

ここまでで、Thu, 08 May 2014 13:36:12 GMT という文字列が抽出できます。こいつを、

date -s

の引数として与えてあげることで、時間合わせを行います。

管理者権限が必要な場合には、ここに sudo を付けます。