1. import socket,time,re,sys,os,threading
  2. import gevent
  3. from gevent import monkey
  4. monkey.patch_all()
  5.  
  6. socket.setdefaulttimeout(2)
  7.  
  8. #该方法用来处理用户数据的port范围,并计算范围内的port,将其添加到列表中,将列表返回
  9. def handle_port(input_ports):
  10. try:
  11. pattern = re.compile('(^\d{1,5})-(\d{1,5}$)')
  12. match = pattern.match(input_ports)
  13. if match:
  14. start_port = int(match.group(1))
  15. end_port = int(match.group(2))
  16. if end_port <=65535 :
  17. if start_port < end_port:
  18. list =[]
  19. for i in range(start_port, end_port+1):
  20. list.append(i)
  21. return list
  22. else:
  23. print("端口范围输入有误")
  24. exit(0)
  25. else:
  26. print("端口格式输入格式有误。")
  27. exit(0)
  28. except Exception as err:
  29. print(err)
  30. exit(0)
  31.  
  32. #该方法用来处理用户数据的IP地址范围,并计算范围内的IP地址,将其添加到列表中,将列表返回
  33. def handle_ip(input_addrs):
  34.  
  35. try:
  36. pattern = re.compile('(\d{1,3}\.\d{1,3}\.\d{1,3}\.)(\d{1,3})-(\d{1,3})') # 匹配标准点进制的IP
  37. match = pattern.match(input_addrs)
  38. if match:
  39. list = []
  40. for i in range(int(match.group(2)),int(match.group(3))+1):
  41. addr = match.group(1)+str(i)
  42. list.append(addr)
  43. return list
  44. else:
  45. print("ip地址格式输入有误")
  46. exit(0)
  47. except Exception as err:
  48. print(err)
  49. exit(0)
  50.  
  51. #调用socket方法进行tcp端口扫描,client.connect()方法的返回值如果为None,则说明端口开放,若无返回值,说明连接超时,就没有返回值
  52. def scaner(ip,port):
  53. try:
  54. client = socket.socket()
  55. res = client.connect((ip,port))
  56. if not res:
  57. open_port = []
  58. print(ip,":",port," is open")
  59. open_port.append((ip,port))
  60. return open_port
  61.  
  62. except Exception as e:
  63. pass
  64.  
  65. finally:
  66. client.close()
  67.  
  68. #本方法对传递来的列表ports进行循环,每次循环启动一个协程,在协程内部将port和addr进行配对,并调用scaner方法进行扫描
  69. def coroutine_scan(addr,ports):
  70. list = []
  71. for port in ports:
  72. eve = gevent.spawn(scaner, addr, port)
  73. list.append(eve)
  74. gevent.joinall(list)
  75.  
  76. #本方法对传递来的列表addrs进行循环,每一次循环启动一个进程,并将addrs循环出来的数据和ports列表传递给coroutine_scan方法
  77. def thread_scan(addrs,ports):
  78. for addr in addrs:
  79. t = threading.Thread(target=coroutine_scan, args=(addr, ports))
  80. t.start()
  81.  
  82. #本方法用来接收参数,并调用handle_port,handle_ip对输入的内容进行处理,然后将返回的列表数据传递给thread_scan
  83. def main():
  84.  
  85. input_addrs = input("输入IP地址范围:如'192.168.0.1-45'\n>>").strip()
  86. input_ports = input("输入端口范围:如'1000-1005'\n>>").strip()
  87.  
  88. if len(input_addrs) and len(input_addrs)> 0:
  89.  
  90. ports = handle_port(input_ports)
  91. addrs = handle_ip(input_addrs)
  92.  
  93. print("开始扫描.......")
  94. thread_scan(addrs,ports)
  95.  
  96. else:
  97. print("请输入正确的IP地址范围和端口。")
  98. main()
  99.  
  100. if __name__ == "__main__":
  101. main()

portscaner 多线程、多协程并发端口扫描的更多相关文章

  1. Python并发编程——多线程与协程

    Pythpn并发编程--多线程与协程 目录 Pythpn并发编程--多线程与协程 1. 进程与线程 1.1 概念上 1.2 多进程与多线程--同时执行多个任务 2. 并发和并行 3. Python多线 ...

  2. python单线程,多线程和协程速度对比

    在某些应用场景下,想要提高python的并发能力,可以使用多线程,或者协程.比如网络爬虫,数据库操作等一些IO密集型的操作.下面对比python单线程,多线程和协程在网络爬虫场景下的速度. 一,单线程 ...

  3. python 多进程,多线程,协程

    在我们实际编码中,会遇到一些并行的任务,因为单个任务无法最大限度的使用计算机资源.使用并行任务,可以提高代码效率,最大限度的发挥计算机的性能.python实现并行任务可以有多进程,多线程,协程等方式. ...

  4. python3 - 多线程和协程速率测试对比

    多线程和协程都属于IO密集型,我通过以下用例测试多线程和协程的实际速率对比. 实例:通过socket客户端以多线程并发模式请求不同服务器端(这里服务器端分2种写法:第一种服务器通过协程实现,第二种服务 ...

  5. 深入浅析python中的多进程、多线程、协程

    深入浅析python中的多进程.多线程.协程 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源 ...

  6. 多线程 多进程 协程 Queue(爬虫代码)

    快速理解多进程与多线程以及协程的使用场合和特点 首先我们来了解下python中的进程,线程以及协程! 从计算机硬件角度: 计算机的核心是CPU,承担了所有的计算任务.一个CPU,在一个时间切片里只能运 ...

  7. python3通过gevent.pool限制协程并发数量

    协程虽然是轻量级的线程,但到达一定数量后,仍然会造成服务器崩溃出错.最好的方法通过限制协程并发数量来解决此类问题. server代码: #!/usr/bin/env python # -*- codi ...

  8. windows下多进程加协程并发模式

    好久没更新博客了.正好最近要整理一下最近这段时间做过的项目以及学习python的一些心得.如标题所示,今天就来说说windows下多进程加协程并发模式.其实网上还是蛮多在linux下的多进程加协程并发 ...

  9. Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)

    Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...

随机推荐

  1. Spark操作parquet文件

    package code.parquet import java.net.URI import org.apache.hadoop.conf.Configuration import org.apac ...

  2. AWS云使用100条宝贵经验分享

    在今天的文章中,我整理出了大量当初曾经错过.而至今仍将我追悔莫及的Amazon Web Services(简称AWS)使用心得.在几年来的实践当中,我通过在AWS之上新手构建及部署各类应用程序而积累到 ...

  3. linux (fedora 28) 制作启动U盘,启动盘

    最近需要安装一款Linux, 由于使用的计算机系统为 fedora 28, 所以只能在linux 制作U盘 使用 df 或者 fdisk -l 查看 U盘文件: Disk /dev/sdb: byte ...

  4. if else; while; break;continue ----流程控制系列

    第一种语法: if 条件: # @引号是为了把条件和结果分开. 结果1 # 一个Tab或者4个空格 @告诉程序满足上面的if条件才会执行结果1结果2 #如果条件为真(True),执行结果1,然后执行结 ...

  5. 【Linux基础】VI 编辑器基本使用方法

    vi编辑器是所有Unix及Linux系统下标准的编辑器.对Unix及Linux系统的任何版本,vi编辑器是完全相同的,它是Linux中最基本的文本编辑器. 第一章vi的三种模式 第二章vi文本编辑器 ...

  6. 前端数据库——WebSQL和IndexedDB

    一.WebSQL WebSQL是前端的一个独立模块,是web存储方式的一种,我们调试的时候会经常看到,只是一般很少使用.并且,当前只有谷歌支持,ie和火狐均不支持. 我们对数据库的一般概念是后端才会跟 ...

  7. JavaScript的基本包装类型_String类型

    String类型概述 String在底层字符串是以字符数组的形式保存的 var str = "Hello"; // 在底层其实就是['H','e','l','l','o'] 字符串 ...

  8. js模块化规范—概念和模块化进化史以及模块化的问题

    模块的概念 一个复杂的项目开发中,会写很多js文件,一个js文件执行某些特定的功能,那么每个js都可以称为一个模块,这就是模块的概念 每个js模块内部数据/实现是私有的, 只是向外部暴露一些接口(方法 ...

  9. maven 将jar包推送到自己本机的maven库

    mvn install:install-file -DgroupId=com.wdcloud.sdk -DartifactId=front-category-signed -Dversion=1.0. ...

  10. Nginx代理与负载均衡

    序言 Nginx的代理功能与负载均衡功能是最常被用到的,关于nginx的基本语法常识与配置已在上篇文章中有说明,这篇就开门见山,先描述一些关于代理功能的配置,再说明负载均衡详细. Nginx代理服务的 ...