如何让telnetlib通过代理路由?参考requests.get(proxies=)实现方式
实现telnetlib通过代理路由流量的方案
嘿,刚好我之前也碰到过类似的需求——telnetlib本身确实不像requests那样自带proxies参数直接配置代理,但有几种靠谱的实现方式,我给你梳理一下:
方案1:用pysocks包装socket(推荐用于SOCKS代理)
telnetlib底层依赖Python的socket模块,所以我们可以用pysocks库把全局socket替换成支持SOCKS代理的版本,这样telnetlib就能自动走代理了,步骤很简单:
- 先安装pysocks:
pip install pysocks
- 代码示例:
import telnetlib import socks import socket # 配置SOCKS5代理(如果是SOCKS4,把SOCKS5改成SOCKS4即可) socks.set_default_proxy( proxy_type=socks.SOCKS5, addr="your_proxy_host", port=your_proxy_port, username="proxy_user", # 可选,代理需要认证时填 password="proxy_pass" # 可选,代理需要认证时填 ) # 替换全局socket为socksocket socket.socket = socks.socksocket # 接下来正常使用telnetlib就行,流量会自动走代理 try: tn = telnetlib.Telnet("target_host", target_telnet_port) tn.write(b"your_telnet_command\r\n") # 读取响应示例 response = tn.read_until(b"prompt_string", timeout=10) print(response.decode()) finally: tn.close()
方案2:手动通过HTTP代理建立CONNECT连接(用于HTTP代理)
如果你的代理是HTTP类型,因为HTTP代理支持CONNECT方法来建立TCP隧道,我们可以先手动和代理建立连接并发送CONNECT请求,再把这个已建立的socket交给telnetlib使用:
代码示例:
import telnetlib import socket from base64 import b64encode def create_telnet_via_http_proxy(target_host, target_port, proxy_host, proxy_port, proxy_user=None, proxy_pass=None): # 1. 连接到HTTP代理服务器 proxy_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) proxy_socket.connect((proxy_host, proxy_port)) # 2. 构造并发送CONNECT请求 connect_request = ( f"CONNECT {target_host}:{target_port} HTTP/1.1\r\n" f"Host: {target_host}:{target_port}\r\n" ) # 如果代理需要基础认证,添加Authorization头 if proxy_user and proxy_pass: auth_str = b64encode(f"{proxy_user}:{proxy_pass}".encode()).decode() connect_request += f"Proxy-Authorization: Basic {auth_str}\r\n" connect_request += "\r\n" proxy_socket.sendall(connect_request.encode()) # 3. 检查代理的响应,确认隧道建立成功 proxy_response = proxy_socket.recv(4096).decode() if not proxy_response.startswith("HTTP/1.1 200"): raise Exception(f"代理连接失败,响应内容:{proxy_response}") # 4. 将已建立的socket交给telnetlib tn = telnetlib.Telnet() tn.sock = proxy_socket return tn # 使用示例 try: tn = create_telnet_via_http_proxy( target_host="your_target_host", target_port=23, proxy_host="your_http_proxy_host", proxy_port=8080, proxy_user="proxy_user", # 可选 proxy_pass="proxy_pass" # 可选 ) tn.write(b"login\r\n") # 后续操作... finally: tn.close()
注意事项
- 如果是HTTPS代理,其实和HTTP代理的处理方式一致,因为CONNECT方法是通用的TCP隧道建立方式
- 两种方案都要确保代理服务器允许telnet端口(通常是23)的流量通过
- 记得处理超时和异常情况,避免连接挂死
内容的提问来源于stack exchange,提问作者Bluescream
相关产品推荐
相关产品推荐

