未読になっていたネットワーク関連のブログを何気なくチェックしていて、ネットワークエンジニアに成るさんのネットワークのリモート監視と操作と現場マンというエントリーで
こういうときはツールに頼ればいい。とあって、Expingに頼らないで、JScriptで、書けるかなぁと思ってちょっとチャレンジしてみて、作成約1時間ほどかかったけどできた!
ネットワークやっている人なら必ず触ると思われる
Expingでpingを連続で打ち続けていた。
こういう地道な作業に対しては、Windows系ならVBScript、Unix/Linux系ならPerlやRubyや最近だとPythonとかになるだろうけど、いづれにしても、1つ得意なのを知っておくと、いざっていうときに、色々と応用がきくかなぁと。
下記がサンプルコードです。(IPアドレス羅列してるから本当はこの部分はテキストファイルとかから読み込ませるようにしたほうが処理的には綺麗だと思うけど、とりあえずということで)
コマンドラインで実行するとこんな感じでループしつづける
192.168.1.2-->NO REPLY RECEIVED
192.168.1.1-->REPLY RECEIVED
192.168.1.2-->NO REPLY RECEIVED
192.168.1.1-->REPLY RECEIVED
192.168.1.2-->NO REPLY RECEIVED
192.168.1.1-->REPLY RECEIVED
192.168.1.2-->NO REPLY RECEIVED
192.168.1.1-->REPLY RECEIVED
ここからソースコード
do {
var h;
h = checkHours();
var IP1="192.168.1.1";
var IP2="192.168.1.2";
exPing(IP1);
exPing(IP2);
/*
ループしつづけるとCPU使用率上がるので
待ってから処理を行う。1000だと1秒
*/
WScript.Sleep (1000);
} while(h
function checkHours() {
var currentTime,currentHours;
currentTime = new Date();
currentHours = currentTime.getHours();
return(currentHours);
}
function exPing(IPAddress) {
var objShell = new ActiveXObject("WScript.Shell");
var objExecObject = objShell.Exec
("%comspec% /c ping -n 1 -w 1000 " + IPAddress);
do {
var strText = objExecObject.StdOut.ReadAll()
/*
search メソッドでPingの実行結果にReplyが含まれるかどうか
確認。一致する文字列が見つらない場合には-1が返るためその数値を
条件判定式で利用
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/script56/html/js56jsmthsearch.asp
*/
var reg = /Reply/i;
if(strText.search(reg)>0) {
WScript.Echo(IPAddress + "-->REPLY RECEIVED");
} else {
WScript.Echo(IPAddress + "-->NO REPLY RECEIVED");
}
} while(!objExecObject.StdOut.AtEndOfStream);
return null;
}