// ファイル転送ディレクトリをtree状に取得 $cmd = "/usr/bin/tree -NsD /home/user1/backup > /home/jcn/script/tmp.log"; $ret = exec($cmd); $msg = $msg . "\n\n------------------\n\n"; // 文字化けを20h(半角スペースに変換 \40は8進でスペース) $cmd = "/bin/cat /home/jcn/script/tmp.log | /usr/bin/tr '\240\302' '\040\040' > /home/jcn/script/user1_2.log"; $ret = exec($cmd);
次のmypingというshellで出るlogをWebで表示
#! /bin/sh date >> ~okada/log/pinglog ping -c3 202.59.187.76 >> ~okada/log/pinglog
<?php $match ="^rtt"; $fp = popen("/usr/bin/tail -200 ~okada/log/pinglog", "r"); while (!feof($fp)) { $line = fgets($fp, 1024); printf("%s <br>\n", $line); if (mb_ereg($match, $line)) { echo " <HR> Date : "; } } pclose($fp); ?>
以下のshellスクリプトをpinglog生成のため作成し、cronに登録
#! /bin/sh export LANG=ja_JP.eucJP date > ~okada/log/pinglog.err ping -c2 wwwism.dyndns.org >> ~okada/log/pinglog.err 2>&1 <==標準エラーも記録 ping -c2 202.91.212.66 >> ~okada/log/pinglog.err /home/okada/script/icmpcheckmail.php > /dev/null 2>&1 <=nullに全てリダイレクトしないとcron実行ごと、管理メールが配信される。
icmpcheckmail.phpで
#!/usr/local/bin/php -q <?php //Ping(ICMP)でパケットロスしたらメールを送る $mailaddress = "okada@abc.ac.jp"; $fp = @fopen("/home/okada/log/pinglog.err", "r"); if (!$fp) exit; $flag = 0; $msg= ""; $s0 = ""; $s = ""; while(!feof($fp)){ $s = fgets($fp, 4096); $msg = $msg . $s; if(strpos($s, "パケット損失 100%")){//ROUTER ERR :3 if(strpos($s0, "wwwism")){//DDNS ERROR :1 $flag = $flag + 1; }else{// DHCP Changed :2 $flag = $flag + 2; } } //DDNS Servce Error: DDNSで名前解決してくれない if(strpos($s, "不明なホスト")) $flag = $flag + 4; $s0 = $s; } if ($flag == 0) exec("/bin/echo 0 > /home/okada/log/pinglog.flag"); fclose($fp); //ファイルから1行ごと配列の取り込む $array = file("/home/okada/log/pinglog.flag"); $fflag = $array[0]; //メール送信 if($flag != 0 && $fflag == 0){ if($flag == 1){ $subject = "DDNS Error"; }else if($flag == 2){ $subject = "DHCP Changed"; }else if($flag == 3){ $subject = "ROUTER Error"; }else{ $subject = "DDNS Service Error"; } $subject = mb_convert_encoding($subject, "ISO-2022-JP", "EUC-JP"); $subject = mb_encode_mimeheader($subject, "ISO-2022-JP", "B"); $fp = popen("/usr/bin/nkf -m0 | /usr/sbin/sendmail -oi -t","w"); fwrite($fp, "From: okada@abc.ac.jp\n"); fwrite($fp, "Reply-To: okada@abc.ac.jp\n"); fwrite($fp, "To: ". $mailaddress . "\n"); fwrite($fp, "Subject: " . $subject ."\n"); fwrite($fp, "Mime-Version: 1.0\n"); fwrite($fp, "Content-Type: text/plain; charset=ISO-2022-JP\n\n"); fwrite($fp, $msg . "\n"); pclose($fp); //一度メールを送ったら、2回目のメールは出さないようにする exec("/bin/echo 1 > /home/okada/log/pinglog.flag"); } ?>
その後
$ chmod a+x icmpcheckmail.php
で実行権を与える
/home/okada/log/pinglog.flagは0のときは正常1:のときはなんらかのエラー時で、このファイルに1があるときは、メール送信しない。初めてエラーになるときは0なのでメール送信し、その後1を立てるので、同じ内容を複数回メール送信しないようにしている。