[bash]DHCP環境下のIPアドレスをcronで自動通知する


最近、公私にわたりデモ環境を持ち歩くことが増えたので、いちいちコンソールからログインしなくてもSSHで一撃ログインできるようにしたいなーと思っている (っ´∀`)っ ゃーですこんにちは。

私が持ち歩いているデモ環境はDHCP配下でIPアドレスを貰うようにしているので、OS起動後にeth0がUPになった後に以下の振る舞いをするようにしてみました。実行環境は、 Scientific Linux release 6.1 (Carbon) ですが、CentOSやFedora、RHELでも動くはずです。

  1. 前回のIPアドレスを保存したファイルがなく、かつeth0のインターフェイスがUPしていたら、指定したメールアドレスにIPアドレスを通知してIPアドレス保存ファイルにIPアドレスを記録する
  2. 前回のIPアドレスと今回のIPアドレスに差異があったら、指定したメールアドレスにIPアドレスを通知してIPアドレス保存ファイルに新しいIPアドレスを記録する

ソースは以下の通り。
[cc lang='bash' ]
#!/bin/bash
LANG=C # 表示を英語にする (特定の言語環境に動作が左右されないようにするため)
TMPDIR=${HOME}/tmp # テンポラリディレクトリを指定
ADDRFILE=${TMPDIR}/IP_ADDR.txt # IPアドレス記録ファイルを指定
IFCONFIG=/sbin/ifconfig # ifconfigコマンドのフルパスを指定 (一般ユーザにはPATHが通っていないため)
EGREP=/bin/egrep # grepコマンドのフルパスを指定
AWK=/bin/awk # awkコマンドのフルパスを指定
SED=/bin/sed # sedコマンドのフルパスを指定
UPCHK=$(${IFCONFIG} | ${EGREP} '(UP BROADCAST RUNNING MULTICAST)' > /dev/null 2>&1 ; echo $?) # ifconfigコマンドでUPステータスを捕まえる
MAIL=/bin/mail # mailコマンドのフルパスを指定
MAILTO=oresama@example.com # 通知先メールアドレスを指定

[ ! -d ${TMPDIR} ]&& mkdir ${TMPDIR} # テンポラリディレクトリがなければ作成する

# ifconfigによる通知コマンドを関数化する
NOTIFYCMD()
{
${IFCONFIG} eth0 | ${EGREP} UP | ${AWK} '{print $1}' > /dev/null 2>&1 &&
${IFCONFIG} eth0 | ${EGREP} '(inet addr)' | ${AWK} '{print $2}' | ${SED} -e s/addr://g
}

# もしIPアドレス記録ファイルがなく、かつeth0が活性化されていたらメール通知し、IPアドレス記録ファイルを作成する
if [ ! -f ${ADDRFILE} -a 0 = ${UPCHK} ]
then
NOTIFYCMD | ${MAIL} -s "${HOSTNAME} IP Address" ${MAILTO}
NOTIFYCMD > ${ADDRFILE}
# (上の条件に合致しなかった場合)前回のIPアドレスから変更があればメール通知し、IPアドレス記録ファイルを更新する
elif [ ! $(cat ${ADDRFILE}) = $(NOTIFYCMD) ]
then
NOTIFYCMD | ${MAIL} -s "${HOSTNAME} IP Address" ${MAILTO}
NOTIFYCMD > ${ADDRFILE}
fi
[/cc]

今回はかなり手抜きです。とりあえず初回起動(正確にはIPアドレス記録ファイルがない状態)かIPアドレスに変更がなければ通知しないので。あとはcronで適当な間隔で起動してあげればOKです。しかし、前回のIPアドレスをいちいち覚えていない場合は過去のメールを探さなきゃならないので、これまた面倒臭いです。

次回は気が向いたらarpコマンドでデフォルトゲートウェイのMACアドレスを拾って、これもまた前回との差分があればIPアドレスを通知するようにしたいと思います。そんでは、まーたー (っ´∀`)ノシ ねー♪