portscaner 多线程、多协程并发端口扫描
- import socket,time,re,sys,os,threading
- import gevent
- from gevent import monkey
- monkey.patch_all()
- socket.setdefaulttimeout(2)
- #该方法用来处理用户数据的port范围,并计算范围内的port,将其添加到列表中,将列表返回
- def handle_port(input_ports):
- try:
- pattern = re.compile('(^\d{1,5})-(\d{1,5}$)')
- match = pattern.match(input_ports)
- if match:
- start_port = int(match.group(1))
- end_port = int(match.group(2))
- if end_port <=65535 :
- if start_port < end_port:
- list =[]
- for i in range(start_port, end_port+1):
- list.append(i)
- return list
- else:
- print("端口范围输入有误")
- exit(0)
- else:
- print("端口格式输入格式有误。")
- exit(0)
- except Exception as err:
- print(err)
- exit(0)
- #该方法用来处理用户数据的IP地址范围,并计算范围内的IP地址,将其添加到列表中,将列表返回
- def handle_ip(input_addrs):
- try:
- pattern = re.compile('(\d{1,3}\.\d{1,3}\.\d{1,3}\.)(\d{1,3})-(\d{1,3})') # 匹配标准点进制的IP
- match = pattern.match(input_addrs)
- if match:
- list = []
- for i in range(int(match.group(2)),int(match.group(3))+1):
- addr = match.group(1)+str(i)
- list.append(addr)
- return list
- else:
- print("ip地址格式输入有误")
- exit(0)
- except Exception as err:
- print(err)
- exit(0)
- #调用socket方法进行tcp端口扫描,client.connect()方法的返回值如果为None,则说明端口开放,若无返回值,说明连接超时,就没有返回值
- def scaner(ip,port):
- try:
- client = socket.socket()
- res = client.connect((ip,port))
- if not res:
- open_port = []
- print(ip,":",port," is open")
- open_port.append((ip,port))
- return open_port
- except Exception as e:
- pass
- finally:
- client.close()
- #本方法对传递来的列表ports进行循环,每次循环启动一个协程,在协程内部将port和addr进行配对,并调用scaner方法进行扫描
- def coroutine_scan(addr,ports):
- list = []
- for port in ports:
- eve = gevent.spawn(scaner, addr, port)
- list.append(eve)
- gevent.joinall(list)
- #本方法对传递来的列表addrs进行循环,每一次循环启动一个进程,并将addrs循环出来的数据和ports列表传递给coroutine_scan方法
- def thread_scan(addrs,ports):
- for addr in addrs:
- t = threading.Thread(target=coroutine_scan, args=(addr, ports))
- t.start()
- #本方法用来接收参数,并调用handle_port,handle_ip对输入的内容进行处理,然后将返回的列表数据传递给thread_scan
- def main():
- input_addrs = input("输入IP地址范围:如'192.168.0.1-45'\n>>").strip()
- input_ports = input("输入端口范围:如'1000-1005'\n>>").strip()
- if len(input_addrs) and len(input_addrs)> 0:
- ports = handle_port(input_ports)
- addrs = handle_ip(input_addrs)
- print("开始扫描.......")
- thread_scan(addrs,ports)
- else:
- print("请输入正确的IP地址范围和端口。")
- main()
- if __name__ == "__main__":
- main()
portscaner 多线程、多协程并发端口扫描的更多相关文章
- Python并发编程——多线程与协程
Pythpn并发编程--多线程与协程 目录 Pythpn并发编程--多线程与协程 1. 进程与线程 1.1 概念上 1.2 多进程与多线程--同时执行多个任务 2. 并发和并行 3. Python多线 ...
- python单线程,多线程和协程速度对比
在某些应用场景下,想要提高python的并发能力,可以使用多线程,或者协程.比如网络爬虫,数据库操作等一些IO密集型的操作.下面对比python单线程,多线程和协程在网络爬虫场景下的速度. 一,单线程 ...
- python 多进程,多线程,协程
在我们实际编码中,会遇到一些并行的任务,因为单个任务无法最大限度的使用计算机资源.使用并行任务,可以提高代码效率,最大限度的发挥计算机的性能.python实现并行任务可以有多进程,多线程,协程等方式. ...
- python3 - 多线程和协程速率测试对比
多线程和协程都属于IO密集型,我通过以下用例测试多线程和协程的实际速率对比. 实例:通过socket客户端以多线程并发模式请求不同服务器端(这里服务器端分2种写法:第一种服务器通过协程实现,第二种服务 ...
- 深入浅析python中的多进程、多线程、协程
深入浅析python中的多进程.多线程.协程 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源 ...
- 多线程 多进程 协程 Queue(爬虫代码)
快速理解多进程与多线程以及协程的使用场合和特点 首先我们来了解下python中的进程,线程以及协程! 从计算机硬件角度: 计算机的核心是CPU,承担了所有的计算任务.一个CPU,在一个时间切片里只能运 ...
- python3通过gevent.pool限制协程并发数量
协程虽然是轻量级的线程,但到达一定数量后,仍然会造成服务器崩溃出错.最好的方法通过限制协程并发数量来解决此类问题. server代码: #!/usr/bin/env python # -*- codi ...
- windows下多进程加协程并发模式
好久没更新博客了.正好最近要整理一下最近这段时间做过的项目以及学习python的一些心得.如标题所示,今天就来说说windows下多进程加协程并发模式.其实网上还是蛮多在linux下的多进程加协程并发 ...
- Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)
Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...
随机推荐
- Spark操作parquet文件
package code.parquet import java.net.URI import org.apache.hadoop.conf.Configuration import org.apac ...
- AWS云使用100条宝贵经验分享
在今天的文章中,我整理出了大量当初曾经错过.而至今仍将我追悔莫及的Amazon Web Services(简称AWS)使用心得.在几年来的实践当中,我通过在AWS之上新手构建及部署各类应用程序而积累到 ...
- linux (fedora 28) 制作启动U盘,启动盘
最近需要安装一款Linux, 由于使用的计算机系统为 fedora 28, 所以只能在linux 制作U盘 使用 df 或者 fdisk -l 查看 U盘文件: Disk /dev/sdb: byte ...
- if else; while; break;continue ----流程控制系列
第一种语法: if 条件: # @引号是为了把条件和结果分开. 结果1 # 一个Tab或者4个空格 @告诉程序满足上面的if条件才会执行结果1结果2 #如果条件为真(True),执行结果1,然后执行结 ...
- 【Linux基础】VI 编辑器基本使用方法
vi编辑器是所有Unix及Linux系统下标准的编辑器.对Unix及Linux系统的任何版本,vi编辑器是完全相同的,它是Linux中最基本的文本编辑器. 第一章vi的三种模式 第二章vi文本编辑器 ...
- 前端数据库——WebSQL和IndexedDB
一.WebSQL WebSQL是前端的一个独立模块,是web存储方式的一种,我们调试的时候会经常看到,只是一般很少使用.并且,当前只有谷歌支持,ie和火狐均不支持. 我们对数据库的一般概念是后端才会跟 ...
- JavaScript的基本包装类型_String类型
String类型概述 String在底层字符串是以字符数组的形式保存的 var str = "Hello"; // 在底层其实就是['H','e','l','l','o'] 字符串 ...
- js模块化规范—概念和模块化进化史以及模块化的问题
模块的概念 一个复杂的项目开发中,会写很多js文件,一个js文件执行某些特定的功能,那么每个js都可以称为一个模块,这就是模块的概念 每个js模块内部数据/实现是私有的, 只是向外部暴露一些接口(方法 ...
- maven 将jar包推送到自己本机的maven库
mvn install:install-file -DgroupId=com.wdcloud.sdk -DartifactId=front-category-signed -Dversion=1.0. ...
- Nginx代理与负载均衡
序言 Nginx的代理功能与负载均衡功能是最常被用到的,关于nginx的基本语法常识与配置已在上篇文章中有说明,这篇就开门见山,先描述一些关于代理功能的配置,再说明负载均衡详细. Nginx代理服务的 ...