利用 Python 的协程进行快速端口扫描

0x00 协程的优势 协程拥有极高的执行效率,因为子程序切换不是线程切换,而是由程序自身控制,因此没有线程切换的开销。和多线程比,线程数量越多,协程的性能优势就越明显。 不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多 0x01 Python中的协程 协程也就是微线程,python 的 generator(生成器) 中的 yield 可以一定程度上实现协程 在 generator 中,我们不但可以通过 for 循环来迭代,还可以不断调用 next() 函数获取由 yield 语句返回的下一个值。 但是 Python 的 yield 不但可以返回一个值,它还可以接收调用者发出的参数。 0x02 使用 gevent python 中可以通过 generator 实现协程,但是不完全,第三方的 gevent 为 Python 提供了比较完善的协程支持,gevent 可以通过 monkey patch 动态的修改 Python 自带的一些标准库 由于 IO 操作(比如访问网络)非常耗时,经常使程序处于等待状态,而 gevent 可以为我们自动切换协程,再在适当的时候切换回来继续执行,这就保证总有 greenlet 在运行,而不是等待 IO 使用 gevent 可以获得极高的并发性能,但 gevent 只能在 Unix/Linux 下运行,在 Windows 下不保证正常安装和运行 下面 3 个网络操作是并发执行的,且结束顺序不同,但只有一个线程 from gevent import monkey; monkey.patch_all() import requests import gevent def get_resp_size(url): print('GET: %s' % url) html = requests.


Python中执行系统命令

0x00 使用模块 在python执行系统命令一般可以通过3个模块来实现,这三个模块是:os、commands、subprocess 0x01 os模块执行系统命令 一般用os模块的system函数来执行一些简单的命令 >>> import os >>> os.system("pwd") /Users/reber 0 0x02 commands模块执行系统命令 commands这个模块在python3中被移除了 >>> import commands >>> commands.getoutput("pwd") '/Users/reber' >>> commands.getstatusoutput("pwd") (0, '/Users/reber') #返回状态码以及结果 0x03 subprocess模块执行系统命令 task.py代码 def aaa(): s = 0 for x in range(3): time.sleep(1) s += x return s print(aaa()) call函数执行命令(会阻塞到任务完成) 函数原型:subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False) >>> from subprocess import call >>> call(["ls","-l"]) #传入一个list total 16 -rw-r--r-- 1 reber staff 80 8 16 16:19 README.


使用Python读写xml文件

0x00 解析XML的方法 SAX (simple API for XML) python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。 DOM(Document Object Model) 将XML数据在内存中解析成一个树,通过对树的操作来操作XML。 ElementTree(元素树) ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。 我在这里使用ElementTree 0x01 Element对象的属性 每个Element对象都具有以下属性: tag:string对象,表示数据代表的种类 attrib:dictionary对象,表示附有的属性 text:string对象,表示element的内容 tail:string对象,表示element闭合之后的尾迹 若干子元素(child elements) >>> from xml.etree import ElementTree as ET >>> xml = """<books> ... <book id='37476'>aaaa</book> ... <book id='83727'>bbbb</book> ... </books>""" >>> root = ET.fromstring(xml) >>> root.tag 'books' >>> child = root.getchildren() >>> child [<Element 'book' at 0x106f59410>, <Element 'book' at 0x106f59450>] >>> child[0].


MRQ的使用

0x00 MRQ MRQ是Python基于Redis、Mongo和gevent的分布式任务队列。 MRQ一方面旨在像RQ一样简单,另一方面有接近Celery的性能。 MRQ最初的功能设计是为了满足任务队列的各种任务需求(IO密集&CPU密集,很多小任务&几个大任务)。 0x01 设置mongo和redis 因为mrq依赖于redis和mongo,所以先安装设置下 安装redis $ sudo apt-get install redis-server $ netstat -nlt|grep 6379 $ sudo /etc/init.d/redis-server status $ sudo /etc/init.d/redis-server stop $ sudo vim /etc/redis/redis.conf #bind 127.0.0.1 requirepass reber_redis $ sudo redis-server /etc/redis/redis.conf & $ redis-cli > auth reber_redis 安装mongo 可以参考:https://docs.mongodb.com/master/tutorial/install-mongodb-on-ubuntu/ $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6 $ echo "deb [ arch=amd64 ] http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.


下载大文件时显示进度条

0x00 作用 在下载大文件时以进度条的形式显示下载进度,如下图所示: 0x01 代码 #!/usr/bin/env python # -*- coding: utf-8 -*- # code by reber <1070018473@qq.com> import requests from tqdm import tqdm def get_vedio(url,name): resp = requests.get(url=url,stream=True) content_size = int(resp.headers['Content-Length'])/1024/1024 with open(name, "wb") as f: print "download file {}, total size: {}M".format(name,content_size) for data in tqdm(iterable=resp.iter_content(1024*1024),total=content_size,unit='M'): f.write(data) def get_content(filename): data = [] with open(filename) as f: lines = f.readlines() for line in lines: data.append(line.strip()) return data if __name__ == '__main__': urls = get_content('urls.


初识Tornado

0x00 简介 Tornado是一个用Python写的相对简单的、不设障碍的Web服务器架构,用以处理上万的同时的 连接口,让实时的Web服务通畅起来。虽然跟现在的一些用Python写的Web架构相似,比如Django, 但Tornado更注重速度,能够处理海量的同时发生的流量。 0x01 示例 main.py代码如下: #!/usr/bin/env python # -*- coding: utf-8 -*- import tornado.ioloop import tornado.web class IndexHandler(tornado.web.RequestHandler): def get(self): #访问根时触发这个函数 name = self.get_argument('name','wyb') self.write('Hello,' + name) self.write('<br /><a href="/login">login</a>') class MyLoginHandler(tornado.web.RequestHandler): def get(self): self.render('login.html') #若用户请求/login页面则将login.html发送给客户端,客户会看的一个登陆表单 def post(self): #当用户点击提交按钮是触发这个函数 name = self.get_argument('name') #接收表单的name password = self.get_argument('password') #接收表单的password self.write("you name is:%s\nyou password is:%s" % (name,password)) def get_app(): handlers = [ (r"/",IndexHandler), #代表请求/的都让IndexHandler处理 (r"/login",MyLoginHandler), #表示请求/login页面的让MyLoginHandler处理 ] app = tornado.


Python实现CDN的判断

0x00 什么是CDN CDN的全称是Content Delivery Network,即内容分发网络。主要功能是在不同地点缓存内容, 运营商会在全国各地的节点上缓存你的网站网页,通过负载均衡技术,将用户的请求定向到最合适的 缓存服务器上去获取内容,比如说你是上海用户,你访问www.aa.com就会被重定向到上海的节点, 你是北京用户,你也访问www.aa.com,但是你会被重定向到上海的节点。 0x01 判断方法 可以查询CNAME记录,每个cdn厂商都有特有的特征串 查看http返回头的头部信息 0x02 代码 首先安装dnspython这个第三方模块:pip install dnspython #!/usr/bin/env python # -*- coding: utf-8 -*- import sys import dns.resolver import urllib2 import urlparse class CdnCheck(object): def __init__(self, url): super(CdnCheck, self).__init__() self.cdninfo() self.url = url self.cnames = [] self.headers = [] def get_cnames(self): # get all cname furl = urlparse.urlparse(self.url) url = furl.netloc # print url rsv = dns.


使用Python的openpyxl模块读写xlsx文件

0x00 openpyxl模块 这个模块可以让你读写excel文件 0x01 读取数据 代码如下: #!/usr/bin/env python # -*- coding: utf-8 -*- from openpyxl import load_workbook #设置data_only=True,否则如果文件中有计算公式的话读出来的是公式不是数值 wb = load_workbook(filename='aa.xlsx',data_only=True) sheetnames = wb.get_sheet_names() #获得所有表名 print u"存在表:%s" % sheetnames ws = wb.get_sheet_by_name(sheetnames[0]) print u"第一张表表名为:%s" % ws.title #Sheet1 rows = ws.max_row #行数 columns = ws.max_column #列数 print "表%s有%d行%d列" % (ws.title,rows,columns) #10 2 共10行2列 print print u"取部分数据:" print ws['A1'].value,ws['B1'].value print ws['A2'].value,ws['B2'].value print ws.cell(row=1, column=2).value print u"\n输出表%s的所有数据:" % ws.title for x in range(1,rows+1): for y in range(1,columns+1): print ws.


Python爆破zip压缩包

0x00 代码 多线程爆破加密的zip压缩包 #!/usr/bin/env python # -*- coding: utf-8 -*- import sys import optparse import zipfile import threading import Queue queue = Queue.Queue() lock = threading.Lock() result = '' def load_pwd(filename): for line in open(filename,'r'): if line: queue.put(line.strip()) def bruter(zipname,queue): global result zFile = zipfile.ZipFile(zipname) while not queue.empty(): password = queue.get() try: zFile.extractall(pwd=password) # 解压 lock.acquire() print "[Ok] password is: %s" % password lock.release() result = password except: lock.acquire() print "[Error] password not is: %s" % password lock.


Python实现代理

0x00 帮助信息 0x01 代码如下 #!/usr/bin/env python # -*- coding: utf-8 -*- 'This is a proxy' __author__ = 'xxx' import sys import socket import threading import optparse lock = threading.Lock() def locker(msg): lock.acquire() print msg lock.release() def hexdump (src,length=16):#十六进制导出函数 result = [] digits = 4 if isinstance(src,unicode) else 2 for i in xrange(0,len(src),length): s = src[i:i+length] hexa = b' '.join("[%0*X]" % (digits,ord(x)) for x in s) text = b''.join([x if 0x20 <= ord(x) < 0x7F else b'.



可以返回顶部