如何用python写个端口扫描器及各种并发尝试
发表于:2024-11-17 作者:千家信息网编辑
千家信息网最后更新 2024年11月17日,这期内容当中小编将会给大家带来有关如何用python写个端口扫描器及各种并发尝试,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。端口扫描器原理很简单,无非就是操作so
千家信息网最后更新 2024年11月17日如何用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安全错误
数据库的锁怎样保障安全
数据库原理与技术A卷
数据库swap建议
文档管理软件开发费用
校内实训总结网络技术
cad图上怎么修改数据库
oracle 数据库售前
上海投资ipfs服务器
大连服务器报废
数据库应用程序图
餐饮软件开发费用
工厂数据库 唐钢
华为羊城通充值无法连接服务器
沪深科技互联网股票
12306泄漏数据库下载
中国 oss数据库 售后服务
浦江软件开发文档
新华三网络安全入门
高考考生网络安全
艾尔登法环服务器登录不了
南京修善网络技术
数据库系统的冗余度
小米手机网络安全
南山区正规网络技术开发商家
顺义区品质软件开发优势
cad图上怎么修改数据库
二级计算机网络技术及应用
松江区信息软件开发技术指导
如何统计数据库条数
台服地下城数据库在哪个文件夹
网站显示dns服务器可能不可用