命令列工具不讀系統代理。這篇把常用工具的設定方法集中列出來,按需要取用。
假設你的混合連接埠是 7897(在 Clash Verge 的連接埠設定裡確認,不同版本預設值不同)。
先試環境變數:能覆蓋一大半
大部分遵循 Unix 慣例的工具都認這幾個變數:
# macOS / Linux / WSL
export http_proxy=http://127.0.0.1:7897
export https_proxy=http://127.0.0.1:7897
export all_proxy=socks5://127.0.0.1:7897
export no_proxy="localhost,127.0.0.1,::1,*.local,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"# Windows PowerShell(當前會話)
$env:HTTP_PROXY = "http://127.0.0.1:7897"
$env:HTTPS_PROXY = "http://127.0.0.1:7897"
$env:NO_PROXY = "localhost,127.0.0.1,::1,*.local":: Windows CMD
set HTTP_PROXY=http://127.0.0.1:7897
set HTTPS_PROXY=http://127.0.0.1:7897做成 shell 函式方便開關:
# ~/.zshrc 或 ~/.bashrc
proxyon() {
export http_proxy=http://127.0.0.1:7897
export https_proxy=$http_proxy
export all_proxy=socks5://127.0.0.1:7897
export no_proxy="localhost,127.0.0.1,::1,*.local"
echo "✓ proxy on"
}
proxyoff() {
unset http_proxy https_proxy all_proxy no_proxy
echo "✗ proxy off"
}Git
Git 有自己的設定系統,環境變數對 HTTPS 協議有效,對 SSH 協議無效。
# HTTPS 協議
git config --global http.proxy http://127.0.0.1:7897
git config --global https.proxy http://127.0.0.1:7897
# 取消
git config --global --unset http.proxy
git config --global --unset https.proxy
# 查看當前設定
git config --global --get-regexp proxy只對特定網域走代理(推薦,避免公司內網 Git 也走代理):
git config --global http.https://github.com.proxy http://127.0.0.1:7897SSH 協議的 Git([email protected]:xxx.git)不走 http.proxy,需要配 SSH:
# ~/.ssh/config
Host github.com
HostName github.com
User git
Port 22
# macOS / Linux
ProxyCommand nc -X connect -x 127.0.0.1:7897 %h %p
# Windows(Git Bash 自帶 connect.exe)
# ProxyCommand connect -H 127.0.0.1:7897 %h %pnpm / yarn / pnpm
# npm
npm config set proxy http://127.0.0.1:7897
npm config set https-proxy http://127.0.0.1:7897
npm config delete proxy && npm config delete https-proxy # 取消
# yarn (v1)
yarn config set proxy http://127.0.0.1:7897
yarn config set https-proxy http://127.0.0.1:7897
# pnpm
pnpm config set proxy http://127.0.0.1:7897
pnpm config set https-proxy http://127.0.0.1:7897設定寫在 ~/.npmrc,可以直接編輯:
proxy=http://127.0.0.1:7897
https-proxy=http://127.0.0.1:7897
noproxy=localhost,127.0.0.1,.company.comPython / pip
# 單次使用
pip install --proxy http://127.0.0.1:7897 requests
# 永久設定
pip config set global.proxy http://127.0.0.1:7897
pip config unset global.proxy設定檔位置:
- Windows:
%APPDATA%\pip\pip.ini - macOS/Linux:
~/.config/pip/pip.conf
[global]
proxy = http://127.0.0.1:7897
index-url = https://pypi.tuna.tsinghua.edu.cn/simplerequests 庫自己也讀環境變數,代碼裡也能顯式指定:
proxies = {
"http": "http://127.0.0.1:7897",
"https": "http://127.0.0.1:7897",
}
requests.get(url, proxies=proxies)Go
# Go modules 走官方代理(通常夠用,不需要走本地代理)
go env -w GOPROXY=https://proxy.golang.org,direct
# 国內鏡像
go env -w GOPROXY=https://goproxy.cn,direct
# 私有倉庫不走 proxy
go env -w GOPRIVATE=*.company.com,github.com/myorg/*
# 需要走本地代理時(比如拉私有 GitHub 倉庫)
go env -w GOPROXY=direct
export HTTPS_PROXY=http://127.0.0.1:7897Go 的 go get 遵循 HTTP_PROXY / HTTPS_PROXY 環境變數。
Java / Maven / Gradle
Maven(~/.m2/settings.xml):
<settings>
<proxies>
<proxy>
<id>clash</id>
<active>true</active>
<protocol>http</protocol>
<host>127.0.0.1</host>
<port>7897</port>
<nonProxyHosts>localhost|127.0.0.1|*.company.com</nonProxyHosts>
</proxy>
</proxies>
</settings>Gradle(~/.gradle/gradle.properties):
systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=7897
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=7897
systemProp.http.nonProxyHosts=localhost|127.0.0.1|*.company.comJVM 命令列參數:
java -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=7897 \
-Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=7897 \
-Dhttp.nonProxyHosts="localhost|127.0.0.1" -jar app.jarRust / Cargo
~/.cargo/config.toml:
[http]
proxy = "http://127.0.0.1:7897"
[https]
proxy = "http://127.0.0.1:7897"curl / wget
# curl 單次
curl -x http://127.0.0.1:7897 https://example.com
curl --socks5 127.0.0.1:7897 https://example.com
# curl 永久(~/.curlrc)
echo 'proxy = "http://127.0.0.1:7897"' >> ~/.curlrc
# wget 永久(~/.wgetrc)
cat >> ~/.wgetrc <<'EOF'
use_proxy = on
http_proxy = http://127.0.0.1:7897
https_proxy = http://127.0.0.1:7897
EOF系統包管理器
# apt(/etc/apt/apt.conf.d/95proxy)
echo 'Acquire::http::Proxy "http://127.0.0.1:7897";' | sudo tee /etc/apt/apt.conf.d/95proxy
echo 'Acquire::https::Proxy "http://127.0.0.1:7897";' | sudo tee -a /etc/apt/apt.conf.d/95proxy
# dnf/yum(/etc/dnf/dnf.conf 裡加)
# proxy=http://127.0.0.1:7897
# Homebrew(macOS)—— 讀環境變數
export ALL_PROXY=socks5://127.0.0.1:7897
brew install xxx一張速查表
| 工具 | 設定方式 | 是否讀環境變數 |
|---|---|---|
| curl / wget | -x 參數或 .curlrc | ✅ |
| Git (HTTPS) | git config http.proxy | ✅ |
| Git (SSH) | ~/.ssh/config 的 ProxyCommand | ❌ |
| npm / yarn / pnpm | .npmrc | ⚠️ 部分版本 |
| pip | pip.conf | ✅ |
| Go | 環境變數 + GOPROXY | ✅ |
| Maven | settings.xml | ❌ |
| Gradle | gradle.properties | ❌ |
| Cargo | .cargo/config.toml | ✅ |
| Docker daemon | systemd drop-in | ❌ |
| apt / dnf | 各自設定檔 | ⚠️ sudo 下會丟 |
| Homebrew | 環境變數 | ✅ |
為什麼設了環境變數還是不行
更省事的方案:開 TUN
上面這些設定加起來很繁瑣,而且每裝一個新工具可能又要配一遍。
開 TUN 模式後,所有命令列工具自動走代理,一個都不用配。
代價是需要虛擬網路卡權限,且要注意把內網段加進直連規則:
prepend-rules:
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- DOMAIN-SUFFIX,company.com,DIRECT驗證
# 看當前出口 IP
curl https://api.ipify.org
# 看 Git 走沒走代理(-v 會列印連接資訊)
GIT_CURL_VERBOSE=1 git ls-remote https://github.com/git/git 2>&1 | head -20
# 看 npm 設定
npm config list | grep -i proxy也可以打開 Clash Verge 的連接頁,執行命令時觀察有沒有新連接出現——有就說明流量走過來了。
小結
- 先試環境變數,能覆蓋 curl、pip、Go、Cargo、Homebrew 等一大批
- Git、npm、Maven、Gradle、Docker 有自己的設定系統,必須單獨配
- SSH 協議要用 ProxyCommand,或者改用 443 連接埠
no_proxy必須設,否則本地和內網服務全廢sudo記得加-E- 嫌麻煩就開 TUN,但要配好內網直連規則
相關文件
容器裡的 127.0.0.1 不是宿主機。這篇給出 Docker 構建期、執行期、daemon 拉取鏡像三種場景的設定方法,以及 WSL2 網路模式差異下的兩套方案。
讓全家設備零設定接入。講清楚三種接入方式(旁路由、TProxy、TUN)的取舍、完整的設定與 systemd 服務、防火牆規則,以及不影響家人上網的容錯設計。
external-controller 提供的 RESTful API 全表,怎麼用它切換節點、查連接、重載設定,怎麼部署 Web 面板,以及幾個實用的自動化腳本示例。