大概框架
多加判断和异常处理!!!**
解析主机
解析端口
端口扫描
定义主模块(帮助文档)
入口文件调用
import socket,sys,re,threading,optparsedef resolve_host(target_host): #三种情况 1:IP地址、域名、都不是try:pattern = re.compile(r'\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}')res = pattern.match(target_host)if res:return res.group()else:try:target_host = socket.gethostbyname(target_host) #会报错,所以用try exceptexit(0)except Exception as err:print("地址解析错误",err)except Exception as err:print(sys.exc_info()[0],err) #sys.exc_info()[0]获取异常类型,err获取异常内容exit(0)def resovle_port(target_port): #三种情况 1:start_port-end_port 2:xxx,xxx,xxx 3:都不是(不用加try except,因为for循环会自动检测)try:pattern = re.compile(r'(\d+)-(\d+)')res = pattern.match(target_port)if res:start_port = int(res.group(1))end_port = int(res.group(2))return [x for x in range(start_port,end_port+1)] #end_port+1是因为要包含end_port,range默认不包含最后一个值else:return [x for x in target_port.split(',')]except Exception as err:print(sys.exc_info()[0],err)exit(0)def scan(target_host,target_port): #创建对象,设置超时时间,做try、exceptscan = socket.socket()scan.settimeout(5)try:scan.connect((target_host,target_port)) #传入的参数为元组形式print('[+]%s的%3s端口:open' % (target_host,target_port)) #%3s填充字符串,留3个位置,不够空格填充scan.close()except socket.timeout:print("[-]%s的%3s端口:close" % (target_host,target_port))except Exception as err:#print(sys.exc_info()[0],err)exit(0)def main():usage = 'python3 %prog --host <host> --port <port>'parser = optparse.OptionParser(usage,version="%prog v1.0")parser.add_option('--host',dest='target_host',type=str,help='目标主机地址,IP或域名')parser.add_option('--port',dest='target_port',type=str,help='目标主机端口,x-x或x,x,x')(options,args) = parser.parse_args()if options.target_host == None or options.target_port == None:print(parser.usage)exit(0)else:target_host = resolve_host(options.target_host)target_port = resovle_port(options.target_port)for port in target_port:# 传入的参数为元组形式 | 一个参数后面加逗号!!t = threading.Thread(target=scan,args=(target_host,port)).start()if __name__ == '__main__':main()
