import telnetlib from multiprocessing import Pool import threading import time import sys import re import os class Scan(): def __init__(self,ip,mode): self.__ip=ip self.__open=[] self.__mode=mode def check_host(self,ip): output = os.popen('ping -n 1 {}'.format(ip)).readlines() if('无法访问目标主机' not in ''.join(output)): return ip def scanning(self): #探测ip类型 ip_list=[] if(re.match(r'^\d+?\.\d+?\.\d+?\.\d+?$',self.__ip)): #单一ip output = os.popen('ping -n 1 {}'.format(self.__ip)).readlines() if('无法访问目标主机'not in ''.join(output)): ip_list.append(self.__ip) elif(re.match(r'^(\d+?\.\d+?\.\d+?\.)(\d+?)/24$',self.__ip)): #检测局域网存活主机 ip_list.clear() t=self.__ip.split()[0] ip_result=[re.match(r'(\d+?\.\d+?\.\d+?\.)(\d+?)/24',self.__ip).group(1)+str(i) for i in range(0,256)] with Pool(10) as pool: ip_result=pool.map(self.check_host,ip_result) for i in ip_result: if(i!=None): ip_list.append(i) elif(re.match(r'^(\d+?\.\d+?\.\d+?\.)(\d+?)-(\d+?\.\d+?\.\d+?\.)(\d+)$',self.__ip)): #检测范围内ip ip_list.clear() min=int(re.match(r'(\d+?\.\d+?\.\d+?\.)(\d+?)-(\d+?\.\d+?\.\d+?\.)(\d+)',self.__ip).group(2)) max=int(re.match(r'(\d+?\.\d+?\.\d+?\.)(\d+?)-(\d+?\.\d+?\.\d+?\.)(\d+)',self.__ip).group(4))+1 ip_result=[re.match(r'(\d+?\.\d+?\.\d+?\.)(\d+?)-(\d+?\.\d+?\.\d+?\.)(\d+?)',self.__ip).group(1)+str(i) for i in range(min,max)] with Pool(10) as pool: ip_result=pool.map(self.check_host,ip_result) for i in ip_result: if(i!=None): ip_list.append(i) elif(re.match(r'^(\d+?\.\d+?\.\d+?\.)(\d+?),',self.__ip)): #检测多个自定义ip ip_list.clear() list_result=self.__ip.split(',') for ip in list_result: if(re.match(r'\d+?\.\d+?\.\d+?\.\d+?',ip)): output = os.popen('ping -n 1 {}'.format(ip)).readlines() if('无法访问目标主机'not in ''.join(output)): ip_list.append(ip) else: sys.exit('\n\nthe input of ip is wrong! please try again!') if(len(ip_list)==0): sys.exit('\n\nthe host of ip inputed is not exits!!!\n\n') print("\n\n","扫描进行中".center(21,'*'),"\n") print("\n存活的主机:\n\n"+'\n'.join(ip_list)+'\n\n') for ip in ip_list: self.__ip=ip if(self.__mode==0): port_list=[80,8080,443,3306,3389,21,22] elif(self.__mode==1): port_list=[x for x in range(1,65535)] else: sys.exit('\nthe input of mode is wrong! please try again!') pool=Pool(6) list_result=pool.map(self.is_open,port_list) pool.close() pool.join() for i in list_result: if(i != None): self.__open.append(i) self.__open.sort() self.Get() def is_open(self,port): #判断是否开启 check=telnetlib.Telnet() #扫描函数 try: check.open(self.__ip,port) return str(port) except: pass def Get(self): if(len(self.__open)!=0): print("\n "+self.__ip+"开放的端口: \n "+'\n '.join(self.__open)+"\n") else: print("\n "+self.__ip+"开放的端口: \n "+'\n 没有开放端口'+"\n") if __name__ == "__main__": start=time.time() s=Scan(input('\n\nthe type of ip 1. xxx.xxx.xxx.xxx 2. xxx.xxx.xxx.xxx-xxx.xxx.xxx.xxx\ 3. xxx.xxx.xxx.xxx/24 4. xxx.xxx.xxx.xxx,xxx.xxx.xxx.xxx,…… \ninput ip: '),int(input("\n\n0. scan the usual ports 1. scan all ports\nmode: "))) s.scanning() # s.Get() print("\n扫描用时: "+str(round(time.time()-start,2))+ "s") print("\n\n","扫描完成,欢迎下次使用".center(21,'*'),'\n\n') 本程序采用了多线程来自动扫描指定局域网主机、端口