如何用python写个端口扫描器及各种并发尝试
发表于:2024-11-18 作者:千家信息网编辑
千家信息网最后更新 2024年11月18日,这期内容当中小编将会给大家带来有关如何用python写个端口扫描器及各种并发尝试,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。端口扫描器原理很简单,无非就是操作so
千家信息网最后更新 2024年11月18日如何用python写个端口扫描器及各种并发尝试
这期内容当中小编将会给大家带来有关如何用python写个端口扫描器及各种并发尝试,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
端口扫描器原理很简单,无非就是操作socket,能connect就认定这个端口开放着。
import socketdef 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 socketimport threadingdef 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 socketimport threadingfrom Queue import Queuedef 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 multiprocessingdef 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 geventimport 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 socketfrom gevent.pool import Pool...if __name__ == '__main__': pool = Pool(500) pool.map(scan,xrange(1,65536)) pool.join()
concurrent.futures版本
import socketfrom Queue import Queuefrom 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写个端口扫描器及各种并发尝试了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。
线程
版本
端口
扫描器
队列
最大
就是
尝试
内容
模式
消费者
生产者
进程
分析
消费
生产
顾名思义
专业
东西
中小
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
计算机网络技术讲的是什么
北京特种网络技术分类服务标准
大数据时代数据库安全管理
云标签数据库没有数据
非关系型数据库比较常用
网络安全手抄报小短语
杭州促牛网络技术有限公司
直播属于哪种网络技术
镇江品质联想服务器厂
恒远科技的互联网
数据库能迁移到光盘吗
安装游戏无法解析服务器
小皮面板打开数据库
蓝桥杯java软件开发条件
美国网络安全基础设施
数据库应用英文简称
sql 不同数据库 查询
华为软件开发买方议价能力
微信导入数据库失败
学习网络安全有感600字
医院的关系型数据库开发
申请软件开发权利
服务器向手机发送短信
教育软件开发商家
只有数据库表结构
网易服务器显示无法连接至世界
pg数据库远程配置
司法部网站法律法规数据库
银行网络安全视频培训课程
丰巢科技软件开发