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')
本程序采用了多线程来自动扫描指定局域网主机、端口