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

来源: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) 



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

雅虎中国,奇虎全面杀入威客领域

中国互联网进入2008年,一个巨大的变化在不知不觉之中悄悄的走到人们的视野之中。 2008年3月,雅虎中国(cn.yahoo.com)推出了有奖建站和能人自荐栏目,通过悬赏万元鼓励互联网用户在雅虎中国开设个人网站,公布个人才能和智力作品。然…

DeepMind提出强化学习新算法,教智能体从零学控制

来源:人工智能和大数据摘要:3月2日,DeepMind发表博客文章,提出一种称为SAC-X(计划辅助控制)的新学习范式,旨在解决让AI以最少的先验知识,从头开始学习复杂控制问题的挑战。这在真实环…

Guava入门~MoreObjects

import java.math.BigDecimal; import org.hamcrest.CoreMatchers; import org.junit.Assert; import com.google.common.base.MoreObjects;/*** TODO 在此写上类的相关说明.<br>* author gqltt <br>* version 1.0.0 2021年11月11日<br>* see * since JDK 1.…

C++学习之路 | PTA乙级—— 1042 字符统计 (20 分)(精简)

1042 字符统计 (20 分) 请编写程序&#xff0c;找出一段给定文字中出现最频繁的那个英文字母。 输入格式&#xff1a; 输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中任意可见字符及空格组成&#xff0c;至少包含 1 个英文字母&#xff0c;以回车结束&…

gdb 调试命令的使用及总结

GDB: The GNU Project Debugger&#xff1a;http://www.gnu.org/software/gdb/documentation/ 参考&#xff1a;http://www.jianshu.com/p/30ffc01380a0 参考&#xff1a;https://www.ibm.com/developerworks/cn/linux/l-cn-gdbmp/ 参考&#xff1a;http://wiki.ubuntu.org.…

Linux的JVM可以从SUN网站上下载

Linux上的JVM可以到sun的网站上下载&#xff0c;因为以前都用的是Windows的东西&#xff0c;现在Linux需要重新回到命令行模式&#xff0c;从SUN的网站上可以下载不用窗口模式的安装包。默认页面提供的是Java SE 6的&#xff0c;许多应用程序还在4和5上开发&#xff0c;因此还需…

中国各地AI行业政策汇总及解读

来源&#xff1a;数据科学与人工智能随着人工智能的快速发展&#xff0c;国家相继出台一系列政策支持中国人工智能的发展&#xff0c;推动中国人工智能步入新阶段。2017年7月20日&#xff0c;国务院印发了《新一代人工智能发展规划》。规划中提到分三步走&#xff1a;第一步&am…

Guava入门~Lists

import java.util.List; import org.hamcrest.CoreMatchers; import org.junit.Assert; import com.google.common.collect.Lists;/*** TODO 在此写上类的相关说明.<br>* author gqltt<br>* version 1.0.0 2021年11月12日<br>* see * since JDK 1.5.0*/ publ…

C++学习之路 | PTA乙级—— 1043 输出PATest (20 分)(精简)

1043 输出PATest (20 分) 给定一个长度不超过 10 ​4 ​​ 的、仅由英文字母构成的字符串。请将字符重新调整顺序&#xff0c;按 PATestPATest… 这样的顺序输出&#xff0c;并忽略其它字符。当然&#xff0c;六种字符的个数不一定是一样多的&#xff0c;若某种字符已经输出完&…

Boost简介

来源&#xff1a;http://www.cnblogs.com/wangkangluo1/archive/2012/05/28/2521493.html 原文链接 一BOOST Boost带领你远远地超越了C标准库&#xff0c;它使得C编程更优雅、更有活力、更高产。&#xff08;引自&#xff1a;Beyond the C Standard Library: An Introduction …

常州的照片

出差去常州照的几张照片&#xff0c;那边的天气很暖和了。 转载于:https://www.cnblogs.com/Duiker/archive/2008/03/17/1109665.html

从Big Dog到Spot Mini:波士顿动力「四足机器人」进化史概览

来源&#xff1a;雷克世界丨「raicworld」公众号导语&#xff1a;前不久&#xff0c;一段视频刷爆了朋友圈&#xff0c;视频中一个四足机器人不顾人类的阻拦&#xff0c;奋力打开一扇门&#xff0c;最终得以顺利通过。看过视频的人无一不被机器人的“执着”所震撼&#xff0c;一…

掌控谈话~重复对方的话

在谈话中&#xff0c;重复对方的话&#xff0c;是一个增加反馈&#xff0c;同时拉近对方与自己的距离&#xff0c;降低两人的对立性&#xff0c;表现自己同理心&#xff0c;鼓舞对方继续说下去的一个简单的方式。 这是一种温和的引导方式。当你重复对方的话的时候&#xff0c;…

C++学习之路 | PTA乙级—— 1045 快速排序 (25 分)(精简)

1045 快速排序 (25 分) 著名的快速排序算法里有一个经典的划分过程&#xff1a;我们通常采用某种方法取一个元素作为主元&#xff0c;通过交换&#xff0c;把比主元小的元素放到它的左边&#xff0c;比主元大的元素放到它的右边。 给定划分后的 N 个互不相同的正整数的排列&…

重磅《美国机器智能国家战略》

来源&#xff1a; 学术plus2018年3月1日&#xff0c;美国国际战略研究所发布报告《美国机器智能国家战略报告》&#xff0c;提出了机器智能对国防、经济、社会等方面的广泛差异&#xff0c;以及美国在战略制定方面的差距&#xff0c;并给出了具体的意见建议。现将部分内容选编如…

C++ boost 解析 Json

property_tree可以解析ini,xml,json,info等格式的文本 以下示例是解析json格式的文本 #include <iostream> #include <stdlib.h> #include <stdio.h> #include <string> #include <sstream> #include <boost/property_tree/ptree.hpp> #i…

掌控谈话~标注对方的痛苦

为什么会谈话失败&#xff1f; 人与人之间的想法是不一样的。如果对方认为你和自己不是同类&#xff0c;不能体会到自己&#xff0c;在谈话的时候自然而然就建立了严密的防御战线&#xff0c;你没法直接攻进去。 想要主导谈话的你&#xff0c;必须得知道为什么对方会痛苦&…

oracle10g 监听服务无法启动

问题&#xff1a;在“运行”输入services.msc&#xff0c;启动服务OracleOraDb10g_homelTNSListener出现如下错误信息&#xff1a;“本地计算机上的OracleOraDb10g_homelTNSListener服务启动后又停止了。一些服务自动停止&#xff0c;如果它们没有什么可做的&#xff0c;例如“…

C++学习之路 | PTA乙级—— 1046 划拳 (15 分)(精简)

1046 划拳 (15 分) 划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为&#xff1a;每人口中喊出一个数字&#xff0c;同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和&#xff0c;谁就赢了&#xff0c;输家罚一杯酒。两人同赢或两人同…

盘点国内最具实力的双足仿人机器人研发团队有哪些?

来源&#xff1a;工业机器人之家北京理工大学 黄强教授团队北京理工大学借鉴人类长期进化所具备自然、快速、协调运动机理和灵巧结构特征&#xff0c;创新地研究了仿人机器人的仿生运动规划、控制与系统集成等关键技术&#xff0c;取得了新突破。提出了仿人机器人运动规划新方法…