BaseRequestHandler 传参问题
最近在写Cooolis-ms的时候遇到一个坑,学艺不精靠搜索,最终解决了。
问题主要是不知道如何把ArgumentParser
处理的参数传递到继承了BaseRequestHandler
的class
中。
通常情况下,创建一个TCP的socketserver
代码如下:
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
while True:
try:
self.data = self.request.recv(1024).strip()
print("{} wrote:".format(self.client_address[0]))
print(self.data)
self.request.send(self.data.upper())
except ConnectionResetError as e:
print("err",e)
break
if __name__ == "__main__":
HOST,PORT = "localhost",9999
server = socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler)
server.serve_forever()
假若我想对MyTCPHandler
进行一些修饰,添加一些成员属性,那就需要覆盖__init__
函数,很多资料告诉我调用super
可以解决,但是BaseRequestHandler
是有参数的,这些参数必须由ThreadingTCPServer
进行传递。
因此,通过stackoverflow
上的一个大神解决了问题:
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
def __init__(self,request, client_address, server,name):
self.name = name
super().__init__(request, client_address, server)
def handle(self):
while True:
try:
self.data = self.request.recv(1024).strip()
print("{} wrote:".format(self.client_address[0]))
print(self.data)
self.request.send(self.data.upper())
except ConnectionResetError as e:
print("err",e)
break
@classmethod
def Creator(cls, *args, **kwargs):
def _HandlerCreator(request, client_address, server):
cls(request, client_address, server, *args, **kwargs)
return _HandlerCreator
if __name__ == "__main__":
HOST,PORT = "localhost",9999
name = 'handle'
server = socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler.Creator(name))
server.serve_forever()
调用Creator
就可以传递多余的参数。
这个问题解决了,代码都在Cooolis-ms里体现。
Newest Posts
- 静态恶意代码逃逸(第九课)
- 静态恶意代码逃逸(第八课)
- Linux透明代理在红队渗透中的应用
- Web正向代理的思考
- 静态恶意代码逃逸(第七课)
- 这是一个充满挑战的好时代
- 通过OXID解析器获取Windows远程主机上网卡地址
- 如何实现一个Atexec
- 如何实现一个Psexec
- Windows特权提升漏洞-符号
- SSRF漏洞配合Flask的巧妙利用 - 内网漫游
- SQL Server注入 - STUFF与XML Path
- Cobalt Strike Aggressor Script (第二课)
- Cobalt Strike Aggressor Script (第一课)
- 通过反射DLL注入来构建后渗透模块(第一课)
- 更多....