2012-03-04 54 views
1

我正在尝试编写一个bash脚本来确定网络上可用的所有主机的IP地址和MAC地址。出于某种原因,Pingpacklist文件不断变空。我知道arp中的条目并不是永久性的,所以我认为在ping半个网络后转储arp。但它似乎仍然无法获得所有地址的ARP条目。任何建议?网络上的可用主机

#! /bin/bash 

tcpdump -i eth1 -n icmp >> Pingpacketlist & 

count=0 
mod=127; 
for ip in 172.16.1.{1..254}; do 
    let count=count+1; 
    let res=$count%$mod; 
    ping -c 1 -W 1 $ip > /dev/null 2> /dev/null; 
    if [ $? -eq 0 ]; then # for debugging 
    echo "${ip} is up"; 
    else 
    echo "${ip} is down"; 
    fi 
    if [ $res -eq 0 ]; then 
    arp -n -i eth1 >> ARPResults 
    fi 
done 

回答

2

如果你想记录tcpdump的数据包,我建议使用-w选项(它将数据包的二进制表示保存到一个文件中),然后在后面解析它。就像这样:

tcpdump -i eth1 -w Pingpacketlist icmp 

,然后读回来后是这样的:

tcpdump -r Pingpacketlist -n 

但严重的是,如果我想完成自己在做什么,我只想用nmap。您可以使用nmap发现网络上的IP地址和MAC地址是这样的:

nmap -oX nmap.xml -sP 172.16.1.0/24 

你会得到作为输出文件(nmap.xml)与内容是这样的:

</host> 
<host><status state="up" reason="arp-response"/> 
<address addr="172.16.1.3" addrtype="ipv4"/> 
<address addr="00:1A:70:A9:63:BE" addrtype="mac" vendor="Cisco-Linksys"/> 
<hostnames> 
</hostnames> 
<times srtt="1804" rttvar="5000" to="100000"/> 
</host> 

你不如果您不需要它,则不需要生成XML输出;请参阅Wesley回答另一个nmap示例。

如果你真的想推出自己的,可以考虑看ARP表中每一个成功的ping后,像这样:

for ip in 192.168.1.{1..254}; do 
    ping -c 1 -W 1 $ip > /dev/null 2> /dev/null; 
    if [ $? -eq 0 ]; then 
    echo "${ip} is up"; 
    arp -n -i eth0 $ip | grep ether >> ARPResults 
    else 
    echo "${ip} is down"; 
    fi 
done 
2

也许使用nmap代替?

nmap -sP 172.16.1.0/24 

列出所有的主机在网络中,包括MAC地址。

+0

我确实看到了一些消息来源表明nmap的,但我试图避免使用的nmap。 – bigbaeng 2012-03-04 02:15:12

+0

任何特殊原因避免它?为什么不使用它,如果它是一个好的程序,并做你想要的? – Wesley 2012-03-04 02:18:40

+0

在我正在做的练习题中,它只推荐使用ping,arp和tcpdump。 – bigbaeng 2012-03-04 02:22:38