python脚本——ping检测在线主机

记录在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版权协议,转载请附上原文出处链接和本声明。