# 通过代理使用 cURL：重要选项与示例详解

cURL 是验证代理是否正常工作的最快方式，也是各类库所仿照的参照。掌握五个代理参数，就能调试任何客户端。


## 一行命令即可完成

```bash
curl -x http://USER-cc-us:PASS@res.proxshift.com:9000 https://api.ipify.org
```

`-x`（或 `--proxy`）接收内嵌凭据的代理 URL。cURL 会自动使用 CONNECT 为 HTTPS 目标建立隧道，并让代理解析主机名。


## 值得掌握的参数

| 参数 | 用途 |
| --- | --- |
| -x, --proxy URL | 指定代理：协议、主机、端口，以及可选的凭据 |
| -U, --proxy-user user:pass | 单独提供凭据，适合密码含特殊字符的情况 |
| --proxy-basic | 强制使用 Basic 代理身份验证（提供密码时的默认方式） |
| -v | 显示 CONNECT 交互、代理状态码和响应标头 |
| --noproxy '*' | 本次调用忽略代理环境变量 |
| -w '%{time_total}\n' | 输出耗时，以便比较不同出口 |


## SOCKS5 与远程 DNS

```bash
# 在出口端解析主机名（推荐）
curl -x socks5h://USER-cc-de:PASS@res.proxshift.com:9001 https://api.ipify.org

# 在本地解析主机名，再将 IP 发送给代理（会泄露 DNS 查询）
curl -x socks5://USER-cc-de:PASS@res.proxshift.com:9001 https://api.ipify.org
```


## 环境变量

调用 cURL 的工具以及许多其他工具都遵循 `http_proxy`、`https_proxy` 和 `no_proxy`。在一个工作会话开始时导出一次即可。

```bash
export https_proxy="http://USER-cc-us:PASS@res.proxshift.com:9000"
export http_proxy="$https_proxy"
export no_proxy="localhost,127.0.0.1"
curl https://api.ipify.org   # 无需 -x 即可走代理
```


## 解读故障信息

```bash
curl -v -x http://USER:WRONG@res.proxshift.com:9000 https://api.ipify.org 2>&1 | grep -E "CONNECT|HTTP/1.1 4|HTTP/1.1 5"
# < HTTP/1.1 407 Proxy Authentication Required  -> 凭据错误
# < HTTP/1.1 400 Bad Request                    -> 用户名参数错误
# < HTTP/1.1 502 Bad Gateway                    -> 该位置没有出口；扩大范围
```

CONNECT 行上的状态来自网关；`Connection established` 之后的状态来自目标网站。[错误说明页面](https://proxshift.com/zh/docs/errors)列出了每个网关状态码的含义。


## 在循环中轮换会话

```bash
for i in $(seq 1 5); do
  curl -s -x "http://USER-cc-us-sid-run$i-ttl-5m:PASS@res.proxshift.com:9000" https://api.ipify.org
  echo
done   # 五个不同的美国出口；每个出口均可凭其 ID 复用五分钟
```


## 问题

**通过代理访问 HTTPS 时，cURL 是否需要特殊参数？**

不需要。使用 http:// 代理 URL 时，cURL 会自动为 https:// 目标发送 CONNECT；只有在普通 HTTP 上强制建立隧道时才需要 --proxytunnel。

**密码包含 @ 或 :，导致 cURL 失败。**

请使用 -U user:pass 传入凭据，不要将其嵌入 URL；也可以对特殊字符进行 URL 编码。

来源：https://proxshift.com/zh/guides/curl-proxy-options
