2012-03-04 80 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