初学者写脚本,高手指点下啊!!!
发表于 : 2011-08-20 1:03
呵呵,脚本写得不是很好,希望有高手帮我完善,比如使用了外部命令,或语法规范,或更妙的技巧,或更加灵活性……


代码: 全选
#!/bin/bash
#author: InBi
#date: 2011-08-16
#website: http://www.itwhy.org/2011/08-20/939.html
########################################################
awk=/bin/awk
cut=/bin/cut
echo=/bin/echo
grep=/bin/grep
ifconfig=/sbin/ifconfig
expr=/usr/bin/expr
bc=/usr/bin/bc
##################################################################
Ip=`ifconfig eth0|grep "inet addr"|awk -F " " '{printf $2}'|awk -F ":" '{print $2}'`
Mask=`ifconfig eth0|grep "inet addr"|awk -F ":" '{printf $4}'` //获取IP和netmask
##################################################################
for ((i=1;i< =4;i++));do
Tmp=`echo $Ip|awk -F "." '{printf $'$i'}'`
Ip_Bin+=`echo "obase=2;$Tmp"|bc|awk '{printf "%08d\n",$0}'`
Tmp1=`echo $Mask|awk -F "." '{printf $'$i'}'`
Mask_Bin+=`echo "obase=2;$Tmp1"|bc|awk '{printf "%08d\n",$0}'`
done; //把IP和netmask每一段转换成二进制,然后连接起来
##################################################################
Mask_Lng=`echo $Mask_Bin|cut -f 1 -d "0"` //---------总觉得这里不好-----
Mask_Lng=`expr length "$Mask_Lng"` //计算出netmask为“1”的部份有多少位
##################################################################
MyNet=`expr substr $Ip_Bin 1 $Mask_Lng`
MyBro=$MyNet
for ((i=$Mask_Lng;i<32;i++));do
MyNet+="0"
MyBro+="1"
done; //计算出本机的网络号与广播号
##################################################################
MyNet=$((2#$MyNet))
MyBro=$((2#$MyBro)) //把广播号与网络号转换为十进制,用于下面循环
##################################################################
for (( i=$(($MyNet+1)); i< $MyBro; i++ )); do
Tmp=`echo "obase=2;$i"|bc`
Ip1=`expr substr $Tmp 1 8`
Ip1=$((2#$Ip1))
Ip2=`expr substr $Tmp 9 8`
Ip2=$((2#$Ip2))
Ip3=`expr substr $Tmp 17 8`
Ip3=$((2#$Ip3))
Ip4=`expr substr $Tmp 25 8`
Ip4=$((2#$Ip4))
Ip=$Ip1"."$Ip2"."$Ip3"."$Ip4 //每一次循环数转换成二进制,然后8位分一段换成十制制,再连接起来。
##################################################################
ping -n -c 1 $Ip > /dev/null 2>&1
if [ $? == 0 ];then
Mac=`arp -n $Ip|grep $Ip|awk -F " " '{print $3}'`
echo $Ip" "$Mac
fi //Ping每次计算出的IP,成功即提取MAC地址
##################################################################
done;
exit 0