大概框架

多加判断和异常处理!!!**
解析主机

解析端口

端口扫描

定义主模块(帮助文档)

入口文件调用

  1. import socket,sys,re,threading,optparse
  2. def resolve_host(target_host): #三种情况 1:IP地址、域名、都不是
  3. try:
  4. pattern = re.compile(r'\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}')
  5. res = pattern.match(target_host)
  6. if res:
  7. return res.group()
  8. else:
  9. try:
  10. target_host = socket.gethostbyname(target_host) #会报错,所以用try except
  11. exit(0)
  12. except Exception as err:
  13. print("地址解析错误",err)
  14. except Exception as err:
  15. print(sys.exc_info()[0],err) #sys.exc_info()[0]获取异常类型,err获取异常内容
  16. exit(0)
  17. def resovle_port(target_port): #三种情况 1:start_port-end_port 2:xxx,xxx,xxx 3:都不是(不用加try except,因为for循环会自动检测)
  18. try:
  19. pattern = re.compile(r'(\d+)-(\d+)')
  20. res = pattern.match(target_port)
  21. if res:
  22. start_port = int(res.group(1))
  23. end_port = int(res.group(2))
  24. return [x for x in range(start_port,end_port+1)] #end_port+1是因为要包含end_port,range默认不包含最后一个值
  25. else:
  26. return [x for x in target_port.split(',')]
  27. except Exception as err:
  28. print(sys.exc_info()[0],err)
  29. exit(0)
  30. def scan(target_host,target_port): #创建对象,设置超时时间,做try、except
  31. scan = socket.socket()
  32. scan.settimeout(5)
  33. try:
  34. scan.connect((target_host,target_port)) #传入的参数为元组形式
  35. print('[+]%s的%3s端口:open' % (target_host,target_port)) #%3s填充字符串,留3个位置,不够空格填充
  36. scan.close()
  37. except socket.timeout:
  38. print("[-]%s的%3s端口:close" % (target_host,target_port))
  39. except Exception as err:
  40. #print(sys.exc_info()[0],err)
  41. exit(0)
  42. def main():
  43. usage = 'python3 %prog --host <host> --port <port>'
  44. parser = optparse.OptionParser(usage,version="%prog v1.0")
  45. parser.add_option('--host',dest='target_host',type=str,help='目标主机地址,IP或域名')
  46. parser.add_option('--port',dest='target_port',type=str,help='目标主机端口,x-x或x,x,x')
  47. (options,args) = parser.parse_args()
  48. if options.target_host == None or options.target_port == None:
  49. print(parser.usage)
  50. exit(0)
  51. else:
  52. target_host = resolve_host(options.target_host)
  53. target_port = resovle_port(options.target_port)
  54. for port in target_port:
  55. # 传入的参数为元组形式 | 一个参数后面加逗号!!
  56. t = threading.Thread(target=scan,args=(target_host,port)).start()
  57. if __name__ == '__main__':
  58. main()