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