一个记录linux下mtr结果的脚本MTR-Recorder

附带IP归属地查询功能

该脚本可从另一个文件(默认是/root/ip.txt)调用IP。
ip文件的制作,每行一个ip,或每行一个“ip[空格]节点”去写(例:127.0.0.1 北京),这样输出结果会同时输出你的节点名。
也可以在ip前加上[链路名]的方式制作ip文件,这种方式会以链路名生成log文件。


当一个节点数据包发送完并记录之后,自动重复执行。各测试节点互相独立,循环执行。
*有多少个IP就有多少个进程,你可以用[pstree | grep “mr”]查看实时进程数,不会消耗太多机器资源。

如果你想,你甚至可以把整个网段做成IP文件,用他去扫描对端主机是否在线,最好自己做个筛选脚本,不然信息太多会晕的。
如果不喜欢MTR输出的信息,脚本在下面,自己改吧(貌似fping蛮强大的)

 记录数据存放目录结构如下:(这张图和现在脚本的输出不一样,懒得再截了,现在脚本的输出是[*时北京]这种格式)

 

直接输入mr start 使用默认设置执行。


输入mr -h 输出帮助信息。

加入了IP查询功能,借助ip138.com网站实现。(目前有些问题,可能需自己修改才能使用)

输入:mr    [IP],可查询地址

加入对指定MR的log文件插入地址信息

例:mr -i -f 【文件】

 

结果如下:

 

第一次写上百行代码的脚本,有问题和建议,请指正。谢谢    ^_^
 
 
 
 
  
  1. #!/bin/bash 
  2. #2011/11/16 First release 
  3. #2012/11/28 Second release  
  4. #       修改输出格式,增加查询ip归属地功能。 
  5. #LANG=zh_CN.gb2312 
  6. #export LANG 
  7. function script ()  
  8. for (( i=1;i<=${line};i=i+1 )) 
  9. do 
  10.     dir="/var/MR_log/$(date +"%Y")年/$(date +"%m")月/$(date +"%d")日/" 
  11.     ip=$(sed -n ${i}p ${ipfile} | awk '{print $1}'
  12.     nolink=$(sed -n 1p ${ipfile} | awk '{print $1}'
  13.     site=$(sed -n ${i}p ${ipfile}) 
  14.     if [[ ${ip} = "[中国电信]" ]];then 
  15.         filename="时_[中国电信]" 
  16.         echo ${yj} >> ${dir}$(date +%H)${filename} 
  17.   
  18.     elif [[ ${ip} = "[中国网通]" ]];then 
  19.         filename="时_[中国网通]" 
  20.         echo ${yj} >> ${dir}$(date +%H)${filename} 
  21.  
  22.     elif [[ ${ip} = "[中国教育网]" ]];then 
  23.         filename="时_[中国教育网]" 
  24.         echo ${yj} >> ${dir}$(date +%H)${filename} 
  25.  
  26.     elif [[ ${ip} = "[中国铁通]" ]];then 
  27.         filename="时_[中国铁通]" 
  28.         echo ${yj} >> ${dir}$(date +%H)${filename} 
  29.  
  30.     elif [[ ${ip} = "[MTR-RECORDER]" ]];then 
  31.         filename="时_[MTR-RECORDER]" 
  32.         echo ${yj} >> ${dir}$(date +%H)${filename} 
  33.  
  34.     else 
  35.         echo "null" >> /dev/null 
  36.         { 
  37.             while [ "$?" = "0" ] 
  38.             do 
  39.             dir="/var/MR_log/$(date +"%Y")年/$(date +"%m")月/$(date +"%d")日/" 
  40.             mkdir -p ${dir} 
  41.             date="$(date +%H)" 
  42.             echo -e "${site} \n 开始时间: $(date) \n $(mtr -r -n ${count} ${ip}) \n 结束时间: $(date) \n" >> ${dir}${date}${filename} 
  43.             done 
  44.         }& 
  45.     fi 
  46. done 
  47. function ip138 () 
  48. ip1=$(echo $1 | cut -d '.' -f 1) 
  49. ip2=$(echo $1 | cut -d '.' -f 2) 
  50. ip3=$(echo $1 | cut -d '.' -f 3) 
  51. ip4=$(echo $1 | cut -d '.' -f 4) 
  52.     if [ ${ip1} -le 255 -a ${ip1} -gt 0 ] && [ ${ip2} -le 255 -a ${ip2} -ge 0 ] && [ ${ip3} -le 255 -a ${ip3} -ge 0 ] && [ ${ip4} -le 255 -a ${ip4} -ge 0 ];then 
  53.         site=$(curl http://ip138.com/ips.asp?ip=$1 |grep 主数据| cut -d ':' -f 2 | cut -d '<' -f 1) 
  54.         echo ${site} 
  55.     else 
  56.         echo "Error IP!" 
  57.     fi 
  58. function insertsite ()  
  59. line=$(wc -l ${filepath} | awk '{print $1}'
  60. for (( i;i<=${line};i=i+1 )) 
  61. do 
  62.     ip=$(sed -n  ${i}p ${filepath} |cut -d '.' -f 2,3,4,5 ) 
  63.         if [[ $(ip138 ${ip}) = "Error IP!" ]]; then 
  64.             continue 
  65.         else 
  66.             nobackspace=$(ip138 ${ip} | sed 's/ //g'
  67. #       site=$(./ip138 ${ip}) 
  68.             sed -i ''${i}'a \   '${nobackspace}'' ${filepath} 
  69.             line=$(wc -l ${filepath} | awk '{print $1}'
  70.         fi 
  71. done 
  72.  
  73. yj="Tis is YJ's MTR Recorder. Thank you for use!" 
  74. ipfile="/root/ip.txt" 
  75. dir="/var/MR_log/$(date +"%Y")年/$(date +"%m")月/$(date +"%d")日/" 
  76. ip1=$(echo $1 | cut -d '.' -f 1) 
  77. ip2=$(echo $1 | cut -d '.' -f 2) 
  78. ip3=$(echo $1 | cut -d '.' -f 3) 
  79. ip4=$(echo $1 | cut -d '.' -f 4) 
  80.  
  81. if [ "$1" = "-h" ] || [ "$1" = "--help" ];then 
  82.     echo -e "Welcome to use YJ's MTR Recoder(MR).\n 欢迎使用MTR记录器!\n 你可以设置的参数如下: \n -c 数值  设置mtr每个进程的发包数量,默认为10. \n -f 文件  设置程序调用的ip文档,默认为/root/ip.txt \n      例:mr -c 1000 -f ip.txt \n start 开始程序    输入start或直接运行脚本都是使用默认设置启动 \n stop 终止程序   终止所有MR进程,结束程序 \n 当出现刷屏情况时输入:mr stop 可解决。\n 该脚本会使用到mtr、sed、awk、printf、pkill等,如出现报错信息,试试检查这些程序是否可用。\n 如果出现刷屏现象,请使用file检查ip文件是否为UNIX文件,如果是从Windows上传的文件,若无法调用(我测试可直接使用),试着使用dos2unix程序转换格式。 \n 测试记录文件放在/var/MR_log下\n 如出现未知无法解决的问题,请联系作者。\n 联系我:wyyj12@163.com" 
  83.     elif [ "$1" = "-c" ] && [ "$2" -gt 0  ] && [ "$3" = "-f" ];then 
  84.         count="-c $2" 
  85.         ipfile="$4" 
  86.         line=$(wc -l ${ipfile} | awk '{print $1}'
  87.         mkdir -p ${dir} 
  88.         printf "Starting MR \n" 
  89.         script 
  90.  
  91.     elif [ "$1" = "-f" ] && [ "$3" = "-c"  ] && [ "$4" -gt 0 ];then 
  92.         count="-c $4" 
  93.         ipfile="$2" 
  94.         line=$(wc -l ${ipfile} | awk '{print $1}'
  95.         mkdir -p ${dir} 
  96.         printf "Starting MR \n" 
  97.         script 
  98.  
  99.     elif [ "$1" = "-c" ] && [ "$2" -gt 0  ];then 
  100.         count="-c $2" 
  101.         line=$(wc -l ${ipfile} | awk '{print $1}'
  102.         mkdir -p ${dir} 
  103.         printf "Starting MR \n" 
  104.         script 
  105.  
  106.     elif [ "$1" = "-f" ];then 
  107.         ipfile="$2" 
  108.         line=$(wc -l ${ipfile} | awk '{print $1}'
  109.         mkdir -p ${dir} 
  110.         printf "Starting MR \n" 
  111.         script 
  112.  
  113.     elif [ "$1" = "stop" ];then 
  114.         printf "Stop MR \n" 
  115.         pkill mr  
  116.  
  117.     elif [ "$1" = "start" ];then 
  118.         printf "Starting MR for default settings! \n You can input [-h] or [--help] for more settings!\n" 
  119.         line=$(wc -l ${ipfile} | awk '{print $1}'
  120.         mkdir -p ${dir} 
  121.          script 
  122.  
  123.     elif [ "$1" = "-i" ] && [ "$2" = "-f" ];then 
  124. #       printf "Starting MR for default settings! \n You can input [-h] or [--help] for more settings!\n" 
  125.         filepath="$3" 
  126.         insertsite 2> /dev/null  
  127.  
  128.     elif [ ${ip1} -le 255 -a ${ip1} -gt 0 ] && [ ${ip2} -le 255 -a ${ip2} -ge 0 ] && [ ${ip3} -le 255 -a ${ip3} -ge 0 ] && [ ${ip4} -le 255 -a ${ip4} -ge 0 ];then 
  129.         ip138 $1 
  130.  
  131.     elif [ "$1" = "" ];then 
  132.         printf "Starting MR for default settings! \n You can input [-h] or [--help] for more settings!\n" 
  133.         line=$(wc -l ${ipfile} | awk '{print $1}'
  134.         mkdir -p ${dir} 
  135.         script 
  136. else 
  137.     echo -e "Please check input! \n You can input [-h] or [--help] for help!\nSubmit BUG for YJ: wyyj12@163.com" 
  138. fi