呵呵,脚本写得不是很好,希望有高手帮我完善,比如使用了外部命令,或语法规范,或更妙的技巧,或更加灵活性……
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 
 | #!/bin/bash#author:        InBi
 #date:          2011-08-16
 #website:       http:
 ########################################################
 ScanIpMac(){
 Ip_Bin=$(ifconfig $1|sed -rn '/inet /{s/[^:]*:([^ ]*).*/obase=2;\1/;s/\./;/gp}'|bc|xargs printf "%08d")
 Mask_Bin=$(ifconfig $1|sed -rn '/inet /{s/.*Mask:([^ ]*).*/obase=2;\1/;s/\./;/gp}'|bc|xargs printf "%08d")
 #把IP和netmask每一段转换成二进制,然后连接起来。
 Mask_Lng=`printf ${Mask_Bin%%0*}|wc -c`
 #计算出netmask为“1”的部份有多少位。
 MyNet=${Ip_Bin:0:$Mask_Lng}$(printf "%0$((32-$Mask_Lng))d")
 MyBro=${Ip_Bin:0:$Mask_Lng}$(printf "%0$((32-$Mask_Lng))d"|tr 0 1)
 #计算出本机的网络号与广播号,用于下面循环。
 echo -e "\n---------- "start at $(date +"%Y-%m-%d %H:%M:%S")" ----------\n">$HOME/ScanIpMac.lst
 for (( i=$((2#$MyNet+1)); i< $((2#$MyBro)); i++ )); do
 Tmp=$(echo "obase=2;$i"|bc)
 Ip=$(for i in {0..3};do test $i != 0 && printf '.'; printf $((2#${Tmp:$i*8:8}));done)
 #每一次循环数换成二进制,然后8位分一段换成十制制,再连接起来。
 arping -w 0.3 -c 1 $Ip > /dev/null 2>&1 &
 #发送 ARP 包,且不等待响应就进行下一次循环。
 done;
 sleep 5
 #等待 5 秒。
 arp -n -i $1 2>/dev/null|grep ':'|sort -n -u -t "." -k1,1 -k2,2 -k3,3 -k4,4|awk -F ' ' '{print  $1"\t\t"$3}'|tee -a $HOME/ScanIpMac.lst
 #arp -n 输出按 IP 排序后重定向到 ScanIpMac.lst 文件,并打印至标准输出。
 echo -e "\n---------- "End at $(date +"%Y-%m-%d %H:%M:%S")" ------------">>$HOME/ScanIpMac.lst
 exit 0
 }
 if test -n "$1" && test $1 != lo && `ifconfig $1>/dev/null 2>&1`; then
 ScanIpMac $1;
 else
 echo 'NOTE: please enter the right parameter.'
 echo 'For example: ScanIpMac eth0.'
 exit 1
 fi
 
 | 
2011-08-20 更新了获取IP和MASK的方法。感谢ubuntu论坛的”我就是我2”的帮助。
2011-08-21 改进获取字符串长度的方法:printf ${Mask_Bin%%0*}|wc -c,感谢 ubuntu论坛的”fnan”指点
2011-08-25 再次改进,哈哈,还是上面两位的指点。
2011-08-26 增加参数输入,使脚本更加灵活。并且提高了速度,以前需要20分钟,现在只要20秒就行了。
呵呵,只列图哦,不想费话,因为要睡觉了。
| 12
 3
 4
 5
 6
 
 | 192.168.22.1                    08:10:17:6d:04:9c192.168.22.5                    08:11:17:6d:a4:21
 192.168.22.6                    08:14:17:6d:b0:3e
 192.168.22.9                    08:10:57:6d:aa:0c
 192.168.22.20                    08:10:57:6d:0a:ae
 192.168.22.21                    08:60:15:6d:0e:ac
 
 | 
 
    
      
  
  
    
      
      
        
        关于程序与设计 | kernel & MCU & ASIC Lover,Software Engineer | 这里是 @蛋种 的个人博客,与你一起发现更大的世界。