网络上的可用主机

时间:2012-03-04 01:57:41

标签: bash networking

我正在尝试编写一个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 个答案:

答案 0 :(得分:2)

也许改用nmap?

nmap -sP  172.16.1.0/24

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

答案 1 :(得分: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示例。

如果您真的想要自己动手,请考虑在每次成功ping之后查看arp表,如下所示:

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