高頻度IPチェックスクリプト
前書き
巷にはIPの変化を観察して変更時にDDNSを更新するスクリプトは結構あります。
しかし、そのほとんどはPerlなど純正玄箱では使えないor使えなさそうなものが多いです。
でも、IPの変化を追うスクリプトがないと最長20-30分もアクセスできない時間が発生する・・・
メール鯖だと致命的な問題だよ?
どうする?どうする?どうする?どうする?どうする?どうする?
作るか・・・orz
使用上の注意をよく読み、用法・用量を守って正しくお使いください。
このスクリプトはDDNS更新スクリプトのサブスクリプトです。
グローバルIPの変化をチェックし、変更時にDDNS更新スクリプトを呼び出し実行します。
負荷分散機能を搭載していますので、外部鯖の負担を減らすことができます。
・高頻度IPチェックスクリプトver100626、他(ip.tar.gz) md5sum crc32:14A722F1
ip.sh
ip.cgi
getip.sh
mn8300.sh
mr504dv.sh
bhr-4rv.sh
readme.txt
readme_linux.txt
omake.tar.gz
omake.tar.gz.md5
・root権限
・cron
・wget
・DDNS更新スクリプト
・CGIが動作する外部アカウント(ip.cgi利用時)
0.事前準備
wgetをインストールします。
IP取得スクリプト(getip.sh/mn8300.sh)などを置く場所を作成します。
# mkdir /root/datDDNS更新スクリプトを作成し、[/root/]にアップロードします。
# chmod 700 /root/dat/getip.sh設定を変更し、グローバルIPを取得できることを確認します。
getip.shの設定項目(デフォルト) ・wgetの場所(/usr/bin/wget)
# /root/dat/getip.sh http://hoge.fugafuga.com.jp/cgi-bin/ip.cgi1-2)mn8300.shを使う場合
# chmod 700 /root/dat/mn8300.sh設定を変更し、グローバルIPを取得できることを確認します。
mn8300.shの設定項目(デフォルト) ・ログインユーザー名(admin) ・ログインパスワード(admin) ・mn8300のローカルIP(192.168.1.1) ・wgetの場所(/usr/bin/wget)1-3)自分でスクリプトを書く場合
ip.shの設定項目(デフォルト) ・グローバルIP取得スクリプト(/root/dat/mn8300.sh) 注:自分で取得したWEBスペースを利用すること getip0から使用し、使用する場合は行頭の#を削除すること getip0〜getip9までの最大10個 getip.shを利用する場合は'(シングルクォート)でコマンドを括る 使わない場合は行頭に#を追加する ・DDNS更新スクリプトの場所(/root/ddns.sh) ・DDNS更新スクリプト確認キーワード(keyword) 注:この機能はサンプルスクリプトでは無効にしてあります ・IPアドレスのキャッシュファイルの場所(/root/dat/ip.db) ・ログファイルの場所(/var/log/ip.log) ・ロックファイルの場所(/tmp/ip.lock)IPアドレスのキャッシュファイル、ログファイルを作成します。
# echo -n test >/root/dat/ip.db # touch /var/log/ip.log手動で実行し、エラーなく実行されアドレスが変更されているか確認します。
# /root/ip.sh # cat /root/dat/ip.db # cat /var/log/ip.log3.cronに登録し、自動で実行されるようにします。
# crontab -e ┃3-59/5 * * * * /root/ip.sh ┃02 6 * * * /root/ddns.sh 注:ip.shを3-59分の間、5分ごとに実行する 1日1回、6時2分にddns.shを実行するDDNS更新スクリプトは1-3日に1回は実行するように設定します。
外部の鯖を利用する場合、高頻度のグローバルIPの参照は迷惑になります。
cronとip.shの負荷分散設定で1サイト平均30分以上間隔をあけてアクセスするようにしてください。
計算式:[cronの実行間隔]=30/[有効なgetipの数]
まぁ、できるだけ自分のルーターを参照しろってことだね♪
関連ページ ・wget ・DDNS更新スクリプト ・独自ドメインの取得(VALUE DOMAINの場合) ・mydns.jpの場合 ・ddo.jpの場合 ・cronについて
あとがき
かなり時間をかけて温めてきたスクリプトですね。
負荷分散とか汎用化とかいろいろ勉強させてもらいました。
そのおかげでスクリプトの公開が遅れたわけですがw
まぁ、それはいいものを出すためってことで、許してやってください_( (_´Д`)_
負荷分散に関する情報
データ収集期間 05/10/19-16:50から05/11/24-00:45まで 結果 # ./count.sh all count is 10178 cgi0 is 1032 : 10% cgi1 is 991 : 9% cgi2 is 1026 : 10% cgi3 is 1022 : 10% cgi4 is 936 : 9% cgi5 is 1040 : 10% cgi6 is 1006 : 9% cgi7 is 1017 : 9% cgi8 is 1040 : 10% cgi9 is 1068 : 10% データ収集コード(負荷分散コードの最後に記載) echo "WARN : There are 11 scripts or more." exit 32;; esac + #debug : load-balancing + echo "[$(date +%m/%d-%H:%M)] $num" >>/root/chk.txt + #end of debug #check $ip ea=`echo $ip | awk -F "." '{print $1$2$3$4}'` 計算用スクリプト(count.sh) #!/bin/sh cgi=`cat chk.txt | wc -l` cgi0=`cat chk.txt | awk '{print $2}' | grep "0" | wc -l` cgi1=`cat chk.txt | awk '{print $2}' | grep "1" | wc -l` cgi2=`cat chk.txt | awk '{print $2}' | grep "2" | wc -l` cgi3=`cat chk.txt | awk '{print $2}' | grep "3" | wc -l` cgi4=`cat chk.txt | awk '{print $2}' | grep "4" | wc -l` cgi5=`cat chk.txt | awk '{print $2}' | grep "5" | wc -l` cgi6=`cat chk.txt | awk '{print $2}' | grep "6" | wc -l` cgi7=`cat chk.txt | awk '{print $2}' | grep "7" | wc -l` cgi8=`cat chk.txt | awk '{print $2}' | grep "8" | wc -l` cgi9=`cat chk.txt | awk '{print $2}' | grep "9" | wc -l` echo "all count is ${cgi}" hoge0=`expr ${cgi0} \* 100` echo "cgi0 is ${cgi0} : `expr ${hoge0} / ${cgi}`%" hoge1=`expr ${cgi1} \* 100` echo "cgi1 is ${cgi1} : `expr ${hoge1} / ${cgi}`%" hoge2=`expr ${cgi2} \* 100` echo "cgi2 is ${cgi2} : `expr ${hoge2} / ${cgi}`%" hoge3=`expr ${cgi3} \* 100` echo "cgi3 is ${cgi3} : `expr ${hoge3} / ${cgi}`%" hoge4=`expr ${cgi4} \* 100` echo "cgi4 is ${cgi4} : `expr ${hoge4} / ${cgi}`%" hoge5=`expr ${cgi5} \* 100` echo "cgi5 is ${cgi5} : `expr ${hoge5} / ${cgi}`%" hoge6=`expr ${cgi6} \* 100` echo "cgi6 is ${cgi6} : `expr ${hoge6} / ${cgi}`%" hoge7=`expr ${cgi7} \* 100` echo "cgi7 is ${cgi7} : `expr ${hoge7} / ${cgi}`%" hoge8=`expr ${cgi8} \* 100` echo "cgi8 is ${cgi8} : `expr ${hoge8} / ${cgi}`%" hoge9=`expr ${cgi9} \* 100` echo "cgi9 is ${cgi9} : `expr ${hoge9} / ${cgi}`%" exit 0
戻るなら押せ!