来源:http://www.jb51.net/article/86615.htm

关于端口扫描器
端口扫描工具(Port Scanner)指用于探测服务器或主机开放端口情况的工具。常被计算机管理员用于确认安全策略,同时被攻击者用于识别目标主机上的可运作的网络服务。

端口扫描定义是客户端向一定范围的服务器端口发送对应请求,以此确认可使用的端口。虽然其本身并不是恶意的网络活动,但也是网络攻击者探测目标主机服务,以利用该服务的已知漏洞的重要手段。端口扫描的主要用途仍然只是确认远程机器某个服务的可用性。

扫描多个主机以获取特定的某个端口被称为端口清扫(Portsweep),以此获取特定的服务。例如,基于SQL服务的计算机蠕虫就会清扫大量主机的同一端口以在 1433 端口上建立TCP连接。

Python实现

端口扫描器原理很简单,无非就是操作socket,能connect就认定这个端口开放着。

import socket
def scan(port): s = socket.socket() if s.connect_ex(('localhost', port)) == 0: print port, 'open's.close()
if __name__ == '__main__': map(scan,range(1,65536))

这样一个最简单的端口扫描器出来了。
等等喂,半天都没反应,那是因为socket是阻塞的,每次连接要等很久才超时。
我们自己给它加上的超时。

s.settimeout(0.1)

再跑一遍,感觉快多了。

多线程版本

import socket
import threading
def scan(port): s = socket.socket() s.settimeout(0.1) if s.connect_ex(('localhost', port)) == 0: print port, 'open's.close() if __name__ == '__main__': threads = [threading.Thread(target=scan, args=(i,)) for i in xrange(1,65536)] map(lambda x:x.start(),threads)

运行一下,哇,好快,快到抛出错误了。thread.error: can't start new thread。
想一下,这个进程开启了65535个线程,有两种可能,一种是超过最大线程数了,一种是超过最大socket句柄数了。在linux可以通过ulimit来修改。
如果不修改最大限制,怎么用多线程不报错呢?
加个queue,变成生产者-消费者模式,开固定线程。

多线程+队列版本

import socket
import threading
from Queue import Queue
def scan(port): s = socket.socket() s.settimeout(0.1) if s.connect_ex(('localhost', port)) == 0: print port, 'open's.close() def worker(): while not q.empty(): port = q.get() try: scan(port) finally: q.task_done() if __name__ == '__main__': q = Queue() map(q.put,xrange(1,65535)) threads = [threading.Thread(target=worker) for i in xrange(500)] map(lambda x:x.start(),threads) q.join() 

这里开500个线程,不停的从队列取任务来做。

multiprocessing+队列版本
总不能开65535个进程吧?还是用生产者消费者模式

import multiprocessing
def scan(port): s = socket.socket() s.settimeout(0.1) if s.connect_ex(('localhost', port)) == 0: print port, 'open's.close() def worker(q): while not q.empty(): port = q.get() try: scan(port) finally: q.task_done() if __name__ == '__main__': q = multiprocessing.JoinableQueue() map(q.put,xrange(1,65535)) jobs = [multiprocessing.Process(target=worker, args=(q,)) for i in xrange(100)] map(lambda x:x.start(),jobs) 

注意这里把队列作为一个参数传入到worker中去,因为是process safe的queue,不然会报错。
还有用的是JoinableQueue(),顾名思义就是可以join()的。

gevent的spawn版本

from gevent import monkey; monkey.patch_all();
import gevent
import socket
...
if __name__ == '__main__': threads = [gevent.spawn(scan, i) for i in xrange(1,65536)] gevent.joinall(threads) 

注意monkey patch必须在被patch的东西之前import,不然会Exception KeyError.比如不能先import threading,再monkey patch.

gevent的Pool版本

from gevent import monkey; monkey.patch_all();
import socket
from gevent.pool import Pool
...
if __name__ == '__main__': pool = Pool(500) pool.map(scan,xrange(1,65536)) pool.join() 

concurrent.futures版本

import socket
from Queue import Queue
from concurrent.futures import ThreadPoolExecutor
...
if __name__ == '__main__': q = Queue() map(q.put,xrange(1,65536)) with ThreadPoolExecutor(max_workers=500) as executor: for i in range(500): executor.submit(worker,q) 

实例探究Python以并发方式编写高性能端口扫描器的方法相关推荐

  1. python编写一个端口扫描器

    可以使用 Python 来编写一个端口扫描器.下面是一个简单的端口扫描器的代码示例: import socketdef port_scanner(host, port):try:sock = sock ...

  2. python代码扫描工具_用Python编写一个高效的端口扫描器的方法

    PyPortScanner python多线程端口扫描器. 输出示例: Github 背景 有时候,在进行网络相关的研究的时候,我们需要执行一些有目的的参数测量.而端口扫描就是其中比较普遍也比较重要的 ...

  3. 【Python黑帽子】——搭建TCP端口扫描器

    作者名:Demo不是emo  主页面链接:主页传送门 创作初心:一切为了她 座右铭:不要让时代的悲哀成为你的悲哀 专研方向:网络安全,数据结构 每日emo:唯有信仰与日月亘古不变 经过一段时间pyth ...

  4. python编程计算器_Python3-用Python编写计算器的3种方法

    用python实现简单的计算器功能,有很多思路,这里介绍三种方法,并分析各自的优缺点.下图是一个真是的计算器,由StellrWeb摄于Unsplash: 众所周知,根据Tao of Python的规定 ...

  5. Python以特定方式对字符串进行分割的方法

    在Python语言中,对于一个给定的字符串,要求处理后得到的一个新字符串满足以下两个条件: l 字符串中包含的字母全部转换为大写字母 l 每2个字符之间以空格进行分割 在Python语言中应怎样代码实 ...

  6. java编写一个端口扫描器

    好久没写java了,学的时候,也没学习网络编程这一块,无意中看到了一本书,于是小小复习一下java,写个端口扫描器,玩玩吧,网上这种小公具有的是,就是自己无聊写着玩玩. 源代码如下: 共两个类,比较简 ...

  7. python 编写端口扫描器

    编写一个端口扫描器(TCP全连接扫描) 借鉴于:<python绝技:运用python成为顶级黑客> 需要用到的模块: socket optparse(感觉这个不用也可以,但可以学习一下这个 ...

  8. 如何用Python一门语言通吃高性能并发、GPU计算和深度学习

    [CTO讲堂]如何用Python一门语言通吃高性能并发.GPU计算和深度学习 发表于2016-01-04 15:11| 4374次阅读| 来源CSDN| 4 条评论| 作者蒲婧 CTO俱乐部CTOCT ...

  9. python支持的几种并发方式进行简单的总结

    本文对python支持的几种并发方式进行简单的总结. Python支持的并发分为多线程并发与多进程并发(异步IO本文不涉及).概念上来说,多进程并发即运行多个独立的程序,优势在于并发处理的任务都由操作 ...

最新文章

  1. (Android Studio)ActionBar's Theme/Style [ActionBar主题风格修改]
  2. 【Python】100行Python代码轻松开发个人博客
  3. [Nodejs原理] 核心库Libuv入门(Hello World篇)
  4. 【每日一题】7月10日精讲—矩阵取数游戏
  5. beta版本项目冲刺
  6. 此变量非彼变量(python变量)
  7. adb shell操作文件
  8. 腾讯云一站式物联PaaS平台IOT Suite助力行业加速“物联网+”
  9. K8S学习之helm
  10. Ubuntu18.04安装PX4并与ROS联合实验
  11. QT学习笔记(十五):QLabel的点击事件(clicked)添加
  12. 向量法计算体积的思路(没有代码了)
  13. 记录帖-电脑版微信多开
  14. 阴阳师双拉条怎么不被超车
  15. STM32F105双CAN双FIFO通讯心得体会
  16. 订单增2倍?如何利用促销手段瞄准圣诞季高意向顾客?
  17. JVM之垃圾收集算法
  18. 内核启动分析(三)——zImage 解压缩阶段
  19. 为偏执的你准备的5款安卓加密工具
  20. Oracle特殊字符转义

热门文章

  1. 论文浅尝 | SPARQL 语言的 ASK 查询表达性研究进展
  2. 论文浅尝 | 利用图 Transformer 实现基于知识图谱的文本生成
  3. A Comprehensive Survey on Graph Neural Networks
  4. php 流(Stream)
  5. Chapter 3.GDI/DirectDraw Internal Data Structures
  6. 解决i9001WiFi频繁断线
  7. 分享-利用VPC防止病毒软件的进入你的windows电脑
  8. linux网络编程——boa移植
  9. 【计算机网络复习 数据链路层】3.6.2 以太网
  10. Jupyter notebook 导入和卸载 conda 虚拟环境