记录在B站学习的知识
利用ping原理,通过编写python脚本,来检测局域网内某个主机是否在线或检测局域网网段内在线的主机
实验环境
- ubuntu虚拟机
- pycharm
准备工作
- 了解ping原理
PING(Packet Internet Groper),因特网包搜索器,用于测试网络连接量的程序。Ping是工作在TCP/IP网络体系结构中应用层的一个服务命令,主要是向特定的目的主机发送ICMP(Iternet Control Message Protocol 因特网报文控制协议)Echo 请求报文,测试目的站是否可达及了解其有关状态。(百度百科) - 安装 ipaddress 模块
ipaddress 是一个用于检查和操作IP地址的模块,在这个脚本中只是用于迭代生成局域网内的的IP地址,可以用上篇【python脚本——主机发现】 介绍ARP的那种方法来生成(比较麻烦)。
在终端用 pip install ipaddress 进行安装
代码展示
from __future__ import unicode_literals
import ipaddress
import multiprocessing
from scapy.layers.inet import IP,ICMP
from scapy.sendrecv import sr1
SUCCESS=100001
FAILURE=100002
def ping(target_ip):
package=IP(dst=target_ip)/ICMP()/b'hello' #ICMP封装在IP包中
result=sr1(package,timeout=3,verbose=False) #发送数据包
if result:
return target_ip,SUCCESS
else:
return target_ip,FAILURE
#生成局域网内的IP地址
def get_ip_list(ip):
temp = ipaddress.ip_network(ip,False).hosts()
ip_lists=[]
for item in temp:
ip_lists.append(str(item))
return ip_lists
def do_scan(target_ip,thread_num):
print('Please Wait......')
ip_list=get_ip_list(target_ip)
pool=multiprocessing.Pool(processes=int(thread_num)) #进程池
result=pool.map(ping,ip_list)
pool.close() #关闭进程池
pool.join() #阻塞等待
for ip,res in result:
if res==SUCCESS:
print('%-20s%-20s'%(ip,"Success"))
if __name__ == '__main__':
print('Select the sequence number to operate on: 1)specific IP 2)A network segment')
selection = input('input the sequence:')
if selection=='1': #选择检测一个特定的IP
ip = input('the specific ip:')
res = ping(ip)[1]
if res==SUCCESS:
print('%-20s%-20s'%(ip,"Success"))
else:
print('%-20s%-20s'%(ip,"Failure"))
elif selection=='2': #选择检测一个局域网网段
segment = input('a network segment:')
do_scan(segment,64)
else:
print('the number you input is invalid')
结果显示
- 检测一个特定的IP
- 检测一个指定的网段
注意的点
- wireshark抓 ICMP 包演示
可以看到一来一回的ICMP包 - 对于能扫描到的范围
该脚本扫描的是局域网内的主机IP,而且如果扫描的是本机的IP,会显示”Failure“,即该脚本通过扫描发出的数据包是经过本机网卡的,所以如果输入的是主机所在的网段,则返回显示的会是除主机以外在线的主机IP。
版权声明:本文为weixin_46665974原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。