You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让telnetlib通过代理路由?参考requests.get(proxies=)实现方式

实现telnetlib通过代理路由流量的方案

嘿,刚好我之前也碰到过类似的需求——telnetlib本身确实不像requests那样自带proxies参数直接配置代理,但有几种靠谱的实现方式,我给你梳理一下:

方案1:用pysocks包装socket(推荐用于SOCKS代理)

telnetlib底层依赖Python的socket模块,所以我们可以用pysocks库把全局socket替换成支持SOCKS代理的版本,这样telnetlib就能自动走代理了,步骤很简单:

  1. 先安装pysocks:
pip install pysocks
  1. 代码示例:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:30:25