value-domain.comのDDNSを自動で更新するスクリプト

固定IPアドレスを持ってないので,IPアドレスが変わる度value-domainにお知らせしなければなりません.
しかし,IPアドレスが変更されるとSSHも通りませんので出先だと手の施しようがなくなります.

固定IPアドレスは高いので,以下のような要件を満たすシェルスクリプトを書きました.

こうしたい:

・うちで使ってるdebian lennyで動く
・value-domainでだけ使えればいい
・crontabに登録して,10分に1回IPアドレスに変更がないか確認させる
・WAN側IPアドレスを知るのに,外部サーバに問い合わせを行わない(10分に1回問い合わせたらご迷惑でしょう?)

スクリプトのテキスト版はこちら

#!/bin/sh

# Set your account information of VALUE-DOMAIN.com
vdomain=`echo 'hogehoge.com'`;
vpass=`echo 'password'`;

# WAN port
wan_if=`echo 'ppp0'`;

# Getting the current directory of this script
current_dir=`echo $(cd $(dirname $0);pwd)`

# Get older ip address
oldip=`cat $current_dir/getip`;

# Get current ip address
`ifconfig $wan_if | grep "inet addr" | awk '{print $2}' | sed 's@addr:@@'` > $current_dir/getip;

# You can also use this line;
# wget -O $current_dir/getip "http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip";

sleep 5;
newip=`cat $current_dir/getip`;

# Renew (or do not renew)
if [ "$oldip" != "$newip" ]; then
wget -O $current_dir/getip_status "http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=$vdomain&p=$vpass&h=*&i=$newip";
echo "`date` $oldip -> $newip" >> $current_dir/log;
fi

$ sudo crontab -l

*/10 * * * * /bin/sh /usr/local/sbin/vd/vd.sh >/dev/null 2>&1

ファイル構成は

vd.sh       (上記スクリプト本体)
log        (IPアドレスに変更があったときに書いておくファイル)
getip       (アドレスをメモしておく,/tmpに置いた方がよかったかも)
getip_status  (最後にIPアドレスが変更されたときの,value-domain.comからの応答を書いておく)

です.

ifconfigで外側IPアドレスを取得しているので,外側IPアドレスの付与を受けているインターフェースを持つマシンでしか使えません.
まあつまり,PCルータで回す用です.

NAT内で使うには,外部サーバに頼るか,その他の工夫が必要です.
DDNS更新スクリプト(運用編)へ続く

追記@2011-02-26
意外と閲覧数が多いことに気付いたので,一部訂正&テキスト版を置きました

追記@2011-11-09
上記スクリプトをマルチアカウント版に改良してくださった方がいます.感謝.
ValueDomain用のdynamicDNS更新のBashスクリプト

既知のバグ@2011-11-09
Terminalを日本語環境で使用していると上手く動かないようです.つまり,

$ echo $LANG

を実行してja_JP.UTF-8などが表示される場合,使えないということです.(うちの環境ではen_US.utf8が表示されます)
これは,IPアドレスを取得する行,つまり

`ifconfig $wan_if | grep "inet addr" | awk '{print $2}' | sed 's@addr:@@'` > $current_dir/getip;

がコテッコテで環境依存な取得方法であることに由来しています.
動かすには,この行を改良するか言語をen_US.utf8に設定する必要があります.
外部サーバに問い合わせするのを許容するなら,例えば以下のように変更すればいいと思います.

wget -O $current_dir/getip "http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip";