50行python代碼實現個代理server(你懂的)
阿新 • • 發佈:2017-06-30
try sel -m 轉發 size sso ddr bin input
效果截圖例如以下。
之前遇到一個場景是這種:
我在自己的電腦上須要用mongodb圖形client,可是mongodb的server地址沒有對外網開放,僅僅能通過先登錄主機A,然後再從A連接mongodbserverB。
本來想通過sshport轉發的,可是我沒有從機器A連接ssh到B的權限。於是就自己用python寫一個。
原理非常easy。
1.開一個socket server監聽連接請求
2.每接受一個客戶端的連接請求,就往要轉發的地址建一條連接請求。即client->proxy->forward。proxy既是socket服務端(監聽client)。也是socket客戶端(往forward請求)。
3.把client->proxy和proxy->forward這2條socket用字典給綁定起來。
4.通過這個映射的字典把send/recv到的數據原封不動的傳遞
以下上代碼。
#coding=utf-8 import socket import select import sys to_addr = (‘xxx.xxx.xx.xxx‘, 10000)#轉發的地址 class Proxy: def __init__(self, addr): self.proxy = socket.socket(socket.AF_INET,socket.SOCK_STREAM) self.proxy.bind(addr) self.proxy.listen(10) self.inputs = [self.proxy] self.route = {} def serve_forever(self): print ‘proxy listen...‘ while 1: readable, _, _ = select.select(self.inputs, [], []) for self.sock in readable: if self.sock == self.proxy: self.on_join() else: data = self.sock.recv(8096) if not data: self.on_quit() else: self.route[self.sock].send(data) def on_join(self): client, addr = self.proxy.accept() print addr,‘connect‘ forward = socket.socket(socket.AF_INET, socket.SOCK_STREAM) forward.connect(to_addr) self.inputs += [client, forward] self.route[client] = forward self.route[forward] = client def on_quit(self): for s in self.sock, self.route[self.sock]: self.inputs.remove(s) del self.route[s] s.close() if __name__ == ‘__main__‘: try: Proxy((‘‘,12345)).serve_forever()#代理server監聽的地址 except KeyboardInterrupt: sys.exit(1)
效果截圖例如以下。
50行python代碼實現個代理server(你懂的)