发送模块
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR) #防止scapy模块出现错误而生成的日志
from scapy.all import * #导入scapy模块
from random import randint #随机模块random 调用randint随机整数方法
import sys,os
def ping_one(host):
id_ip = randint(1, 65535) # 随机产生IP ID位
id_ping = randint(1, 65535) # 随机产生ping ID位
seq_ping = randint(1, 65535) # 随机产生ping序列号位
packet = IP(dst=host, ttl=1, id=id_ip) / ICMP(id=id_ping, seq=seq_ping) / b'whl' # 构造一个数据包
ping = sr1(packet, timeout=0.2, verbose=False) # 使用ping 发送数据包,timeout超过2秒 关闭详细信息
if ping!=0: # 如果ping有响应信息
os._exit(3) # 退出码
if __name__ == '__main__':
ping_one(sys.argv[1])
多进程调用
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR) #防止scapy模块出现错误而生成的日志
import ipaddress #整理IP
import time #时间模块
import multiprocessing #使用多进程模块
from ping_one import ping_one #导入执行发包模块
from scapy.all import *
import sys,os
def scany_ping_scan(network):
net =ipaddress.ip_network(network) #分析数据中的IP地址
ip_processes={}#进程字典
for ip in net:#迭代提取net中的数据给 ip
ip_addr=str(ip)#把每一个读取多IP转换成字符串
scan_prin_one=multiprocessing.Process(target=ping_one,args=(ip_addr,))#开启多进程 target使用这个函数 并用args把ip_addr中的数据添加进去
scan_prin_one.start()#开启这个进程
ip_processes[ip_addr]=scan_prin_one#把这些进程放进这个字典中
ip_list=[]#设置一个成功列表
for ip,process in ip_processes.items():
if process.exitcode ==3:#退出码为3表示ping成功
ip_list.append(ip)#把存活多IP地址追加到ip_list列表中
else:
process.terminate()
return sorted(ip_list)
if __name__=='__main__':
import time
t1=time.time()
activ_ip=scany_ping_scan(sys.argv[1])
print('存活的IP地址如下:')
for ip in activ_ip:
print(ip)
t2=time.time()
print(t2-t1)