免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2223 | 回复: 4

[系统管理] [已解决]检查主机存活列表,变量共享问题 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2012-11-22 20:47 |显示全部楼层
本帖最后由 defcon 于 2012-11-23 11:04 编辑

今天复习笔记的时候发现了这样一个脚本,可以检查主机存活列表,但是我运行后,一直有个错误,就是如果一个主机是可以ping通,但是导出的html页面有两行,第一行是正确信息,但是第二行就是错误的。如图。
未命名.jpg
脚本如下:
  1. #!/bin/bash
  2. shopt -s -o nounset
  3. HostList=${1:?'please inpute host ip address!'}
  4. [ ! -f $HostList ] && echo 'the file not exist' && exit 1
  5. Date=$(date +"%Y%m%d%H%M")
  6. Date_for_man=$(date +"%Y-%m-%d %Hhour %M minutes")
  7. #the counts of ping
  8. pno=2
  9. #path file to save
  10. padir="/var/www/html/pa"
  11. pahtml="$padir/index.html"
  12. pahtml_now="$padir/pa-$Date.html"

  13. #functions

  14. function html_head(){
  15.   [ ! -e $padir ] && mkdir -p $padir
  16.   cat >$pahtml_now<<HEAD
  17.   <html>
  18.   <head>
  19.   <title>ping alive check result</title>
  20.   <meta HTTP-EQUIV="Refresh" CONTENT="900">
  21.   <meta HTTP-EQUIV="Pragma" CONTENT="no-cache">
  22.   <meta HTTP-EQUIV="Content-type" content="text/html; charset=UTF8">
  23.   </head>
  24.   <body bgcolor="white">
  25.   <div align=center><font size=6><b>***my hosts monitor</b></font></div>
  26.   <div align=center>check time: $Date_for_man</div>
  27.   <p>
  28.     <table width="60%" align=center border=3>
  29.       <tr>
  30.         <td nowrap>hostname</td>
  31.         <td>IP</td>
  32.         <td nowrap>min time</td>
  33.         <td nowrap>max time</td>
  34.         <td nowrap>avg time</td>
  35.       </tr>
  36. HEAD

  37. }
  38. html_tr(){
  39.   if [ "$1" == "PingError" ]
  40.   then
  41.     cat<<TR >>$pahtml_now
  42.     <tr>
  43.         <td>host</td>
  44.         <td>$ip</td>
  45.         <td colspan=4><font color=red><b>can't reachable!!!</b></font></td>
  46.     </tr>
  47. TR
  48.   else
  49.     cat <<TR >>$pahtml_now
  50.       <tr>
  51.         <td>host</td>
  52.         <td>$ip</td>
  53.         <td>$rt_min ms</td>
  54.         <td>$rt_max ms</td>
  55.         <td>$rt_avg ms</td>
  56.       </tr>
  57. TR

  58.     fi
  59. }
  60. html_end(){
  61.   cat >>$pahtml_now<<END
  62.     </table>
  63.   </body>
  64.   </html>
  65. END
  66.   ln -sf $pahtml_now $pahtml
  67. }
  68. #the main of the shell

  69. #check up the webpage head
  70. html_head

  71. while read ip
  72. do
  73.   rt_min=
  74.   rt_avg=
  75.   rt_max=
  76.   ping -c $pno $ip|while read r
  77.   do
  78.   echo "$r"|grep rtt
  79.   if [ $? -eq 0 ]
  80.   then
  81.     echo "fuck you hackers---------------------======================"
  82.       rt_min=$(echo $r | awk '{print $4}'|awk -F/ '{print $1}')
  83.       rt_avg=$(echo $r | awk '{print $4}'|awk -F/ '{print $2}')
  84.       rt_max=$(echo $r | awk '{print $4}'|awk -F/ '{print $3}')
  85.       html_tr $rt_min $rt_avg $rt_max
  86.    fi
  87.   done
  88.   if [ -z $rt_min ]
  89.   then
  90.     html_tr PingError
  91.   fi
  92. done<$HostList
  93. html_end
复制代码
------------------------------------------------------------------------------------------------
  1. while read ip
  2. do
  3.   rt_min=
  4.   rt_avg=
  5.   rt_max=
  6.   ping -c $pno $ip|while read r
  7.   do
  8.   echo "$r"|grep rtt
  9.   if [ $? -eq 0 ]
  10.   then
  11.     echo "fuck you hackers---------------------======================"
  12.       rt_min=$(echo $r | awk '{print $4}'|awk -F/ '{print $1}')
  13.       rt_avg=$(echo $r | awk '{print $4}'|awk -F/ '{print $2}')
  14.       rt_max=$(echo $r | awk '{print $4}'|awk -F/ '{print $3}')
  15.       html_tr $rt_min $rt_avg $rt_max
  16.       echo "$rt_min************************************"
  17.    fi
  18.   done
  19.   if [ -z $rt_min ]
  20.   then
  21.     html_tr PingError
  22.   fi
  23. done<$HostList
复制代码
主要有问题的代码就是这块,如果ip存在执行完后的rt_min传送不到
  1. if [ -z $rt_min ]
  2.   then
  3.     html_tr PingError
  4.   fi
复制代码
这里来,不知道哪个大哥帮忙看看,谢谢。

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
发表于 2012-11-23 08:22 |显示全部楼层
exec 5<$HostList
while read ip <&5
do
  rt_min=
  rt_avg=
  rt_max=
  ping -c $pno $ip|while read r
  do
  echo "$r"|grep rtt
.....
done

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
发表于 2012-11-23 08:26 |显示全部楼层


ping -c $pno $ip|while read r

这里也有一个管道,想办法取消这个管道吧,
比如直接用awk写这个脚本或者用 < <(ping -c $pno $ip)或者弄个命名管道

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2012-11-23 10:47 |显示全部楼层
回复 3# waker


    貌似第一条回复,也没奏效

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2012-11-23 11:03 |显示全部楼层
解决了,这样写就ok了
  1. while read ip
  2. do
  3.   rt_min=
  4.   rt_avg=
  5.   rt_max=
  6.   ping -c $pno $ip >tmp
  7.   r=$(cat tmp|grep rtt)
  8. if [ -n "$r" ]
  9.   then
  10.     echo "fuck you hackers---------------------======================"
  11.       rt_min=$(echo $r | awk '{print $4}'|awk -F/ '{print $1}')
  12.       rt_avg=$(echo $r | awk '{print $4}'|awk -F/ '{print $2}')
  13.       rt_max=$(echo $r | awk '{print $4}'|awk -F/ '{print $3}')
  14.       html_tr $rt_min $rt_avg $rt_max
  15.         echo "$rt_min************************************"
  16. #     export "$rt_min"
  17.    fi
  18.         echo "$rt_min------------------------------"
  19.   if [ -z $rt_min ]
  20.   then
  21.     html_tr PingError
  22.   fi
  23. done<$HostList
  24. html_end
  25. rm -f tmp
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP